前言:
大家好,我是良辰丫🏍🏍🏍,今天我带领大家去学习栈和队列的相关知识,💞💞💞栈和队列在数据结构中是相对简单的,但是应用还是蛮多的,不积小流无以成江海。加油,不断遨游知识的汪洋大海。🚀🚀🚀
🧑个人主页:良辰针不戳
📖所属专栏:java数据结构
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
目录
- 1、栈
- 1.1 入栈序列选择题
- 1.2 模拟栈的基本操作
- 1.3 集合中栈的基本操作
- 2、队列
- 2.1 模拟队列的基本操作
- 2.2 集合中队列的基本操作
1、栈
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。下面摞在一起的碗可以形象的说明栈的特点,先放的碗最后拿出来。

栈的插入操作叫做入栈,栈的删除操作叫做出栈。这是一种特殊的数据结构类型,只能从一端进行操作,简单看一个图来更加深刻的了解栈。

1.1 入栈序列选择题
希望可以通过这个简单的选择题让大家更深刻的认识入栈序列。

- A. 依次入栈ABCDE,然后出栈序列为EDCBA。
- B.先入栈ABCD,然后出一个D,再入栈E,出栈E,==有的伙伴可能会疑惑,不是全要入栈才能进行出栈嘛?嘿嘿嘿,可以进栈一个,紧接着就进行出栈,这是一个误区。==然后出栈CBA。
- C.先入栈ABCD,然后出DC,接着入栈E,然后出栈E,最后出栈,咿呀,我们会发现,现在栈里面还有A和B,但是A先进去的,B压着A,要出栈的话先出B,于是乎!这个出栈序列是错误的。怎么样,很简单吧,比起咱们高中学的知识点,这不是小儿科嘛!
- D.这个序列是进一个出一个,此时,入栈序列和出栈序列是一样的。
1.2 模拟栈的基本操作
在实际操作中,我们不用写关于栈的操作代码,但是我们需要去了解栈的底层原理,通过了解栈的基本操作可以让我们更深刻的认识栈。
下面是java底层原理栈的基本操作。后序我们做题直接调用即可。

以下是模拟栈的基本操作,不难,我们就简单的用注释说明一下。
import java.util.*;
public class MyStack {
//栈的底层原理是数组public int[] elem;public int usedSize;//有效个数public MyStack() {this.elem = new int[10];}//入栈public void push(int val) {if(isFull()) {//满的话进行扩容elem = Arrays.copyOf(elem,2*elem.length);}//记住入栈后有效个数一定要进行加1//如果大家不习惯这种写法,可以分开写elem[usedSize++] = val;}public boolean isFull() {return usedSize == elem.length;}//出栈public int pop() {if(isEmpty()) {//如果栈为空,直接可以抛出异常//不喜欢这种写法可以写一个输出语句提示一下,然后return退出throw new RuntimeException("栈是空的!");}//出栈后usedSize-1,下面两种写法都可以/*int val = elem[usedSize-1];usedSize--;return val;*//* usedSize--;return elem[usedSize];*/return elem[--usedSize];}//判断是否为空public boolean isEmpty() {return usedSize == 0;}//peek和pop是有区别的,peek只提取栈顶元素,并没有出栈public int peek() {if(isEmpty()) {throw new RuntimeException("栈是空的!");}return elem[usedSize-1];}
}
1.3 集合中栈的基本操作
public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(3);stack.push(4);System.out.println(stack.pop());//4System.out.println(stack.pop());//3System.out.println(stack.pop());//2System.out.println(stack.peek());//1System.out.println(stack.pop());//1}
运行结果截图

看到这里,栈所涉及的知识点就基本完了,后面做题过程中,好多数据结构都会用到栈,就连链表相关题目很多都会涉及,学习完简单知识一定要去多刷题。
2、队列
队列这个词大家并不陌生,队列和排队其实大同小异。就像下面的小盆友,站在第一个的先出教室,站在最后一个的最后出教室,于是就引入了队列的特点,先进先出。

2.1 模拟队列的基本操作

模拟队列的基本操作,这是通过一个链表实现的。
public class MyQueue {static class Node {public int val;public Node next;public Node(int val) {this.val = val;}}public Node head;public Node last;public int usedSize;//入队public void offer(int val) {Node node = new Node(val);if(head == null) {head = node;last = node;}else {last.next = node;last = node;}usedSize++;}public int poll() {if(empty()) {throw new EmptyException("队列为空");}int ret = head.val;head = head.next;if(head == null) {last = null;//只有一个节点 那么last也要置空}usedSize--;return ret;}public boolean empty() {return usedSize == 0;}public int peek() {if(empty()) {throw new EmptyException("队列为空");}return head.val;}public int getUsedSize() {return usedSize;}
}
2.2 集合中队列的基本操作
public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.offer(1);queue.offer(2);queue.offer(3);queue.offer(4);System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());}
运行结果截图

后序:
今天栈和队列的学习就告一段落了,希望这篇文章能给大家带来帮助,如果这篇文章给大家带来一定的帮助的话,期待大家的点赞,三连哦!!!⛽⛽⛽你们的支持就是我的加油站哦。



















