Java栈和队列的实现

目录

一.栈(Stack)

1.1栈的概念

1.2栈的实现及模拟

二.队列(Queue)

2.1队列的概念

2.2队列的实现及模拟 

 2.3循环队列

2.4双端队列(Deque)


一.栈(Stack)

1.1栈的概念

栈:一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO Last In First Out )的原则 
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
出栈:栈的删除操作叫做出栈。 出数据在栈顶

 

1.2栈的实现及模拟

public class Test {public static void main(String[] args) {Stack<Integer>s=new Stack();//创建一个空栈s.push(1);//往栈中存入1s.push(2);//2s.push(3);//3s.push(4);//4s.push(5);//5System.out.println(s.size());//有效个数5System.out.println(s.peek());//获取栈顶元素5s.pop();//5出栈System.out.println(s.peek());//此时栈顶元素变为4System.out.println(s.empty());//判断是否为空栈,此时不为空 返回false}
}

 这里我们用自己的方法来模拟实现上述的方法

public class MyStack {int[] elem;int usedSize;public MyStack(){this.elem=new int[10];}public void push(int val){if(isFull()){//扩容elem= Arrays.copyOf(elem,elem.length*2);}elem[usedSize]=val;usedSize++;}public boolean isFull(){return usedSize==elem.length;}public int pop(){if(empty()){return -1;}int oldVal=elem[usedSize-1];usedSize--;return oldVal;}public int peek(){if(empty()){return -1;}return elem[usedSize-1];}public boolean empty(){return usedSize==0;}
}

二.队列(Queue)

2.1队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)

 

2.2队列的实现及模拟 

在Java中,Queue是个接口,底层是通过链表实现的

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。 

public class Test{public static void main(String[] args) {Queue<Integer>q=new LinkedList<>();q.offer(1);//从队尾入q.offer(2);q.offer(3);q.offer(4);System.out.println(q.size());//有效个数 4System.out.println(q.peek());//获取头元素 1q.poll();//1从队列中出System.out.println(q.peek());//2System.out.println(q.isEmpty());//此时队列不为空,所以返回 false}
}

这里我们进行模拟实现上述方法 

public class MyQueue {static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public void offer(int val){ListNode node=new ListNode(val);if(head==null){head=last=node;}else{last.next=node;node.prev=last;last=last.next;}}public int poll(){if(head==null){return -1;}int ret=head.val;if(head.next==null){head=last=null;}else{head=head.next;head.prev=null;}return ret;}public int peek(){if(head == null) {return -1;}return head.val;}public boolean isEmpty(){return head==null;}
}

 2.3循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。

2.4双端队列(Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。

那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

Deque是一个接口,使用时必须创建LinkedList的对象
 

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现  

我将在下篇文章详细讲解这两种队列的使用以及相关OJ题 


如果上述内容对您有帮助,希望给个三连谢谢!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/595949.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

【Kaggle】练习赛《鲍鱼年龄预测》(上)

前言 上一篇文章&#xff0c;讲解了《肥胖风险的多类别预测》机器学习方面的文章&#xff0c;主要是多分类算法的运用&#xff0c;本文是一个回归的算法&#xff0c;本期是2024年4月份的题目《Regression with an Abalone Dataset》即《鲍鱼年龄预测》&#xff0c;在此分享高手…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

【Web应用技术基础】JavaScript(2)——案例:切换按钮的文本

视频已发。截图如下&#xff1a; 很简单的&#xff0c;只需要实现一个按钮的点击方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

【模糊逻辑】Type-1 Fuzzy Systems的设计方法和应用-1

【模糊逻辑】Type-1 Fuzzy Systems的设计方法和应用 4.1 时间序列预测4.2 提取规则的方法4.2.1 One-pass method&#xff08;一次性方法&#xff09;4.2.1.1数据赋值法例子1 4.2.1.1 WM方法 4.2.2 最小二乘法4.2.3 基于导数的方法4.2.4 SVD-QR方法4.2.6 迭代法 4.1 时间序列预测…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

DFS(排列数字、飞机降落、选数、自然数的拆分)

注&#xff1a;1.首先要知道退出条件 2.还原现场 典型&#xff1a;全排列 题目1&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[1005],p[1005],v[1005]; int n; void dfs(int x) {//此次dfs结束条件,即搜到底 if(xn1){for(int i1;i&…

【踩坑日记】因不同系统换行符不同导致的文本读取结果不同的问题

文章目录 1 问题现象描述2 解决过程&#xff08;点击直接跳到解决方法&#xff09;3 原因解释4 如何避免踩坑4.1 格式转换4.2 格式查看 1 问题现象描述 起因是群友问了这么一个问题 确实很奇怪&#xff0c;按理说第二个printf不会完全不输出&#xff0c;于是想到&#xff0c;…

TCP挥手中TIME_WAIT存在的原因

四次挥手的一般过程如图所示&#xff1a; 在客户端收到FIN结束报文的时候不是立刻进入CLOSED状态&#xff0c;而是进入TIME_WAIT状态&#xff0c;一般等2MLS后进入关闭状态。 原因&#xff1a; 1.可靠地终止 TCP 连接。 2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。 …

递归|全排列

全排列一 题目描述 算法原理 我们先把决策树画出来&#xff0c;根据决策树写代码&#xff0c;然后设计函数头 dfs函数用途就是从nums数组选数填入横线 就是有三个位置&#xff0c;我们把1 2 3填进这三个位置&#xff0c;而且保证不重复。 比如我们第一冷选了1之后第二轮就不…

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

【学习分享】小白写算法之选择排序篇

【学习分享】小白写算法之选择排序篇 前言一、什么是选择排序算法二、选择排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 简单排序有三种&#xff0c;冒泡排序&#xff0c;插入排序和选择排序。这三种排序的算法算是入门级别的&#xff0c;打好…