前言:
大家好,我是良辰丫🏍🏍🏍,今天我带领大家去学习栈和队列的相关知识,💞💞💞栈和队列在数据结构中是相对简单的,但是应用还是蛮多的,不积小流无以成江海。加油,不断遨游知识的汪洋大海。🚀🚀🚀
🧑个人主页:良辰针不戳
📖所属专栏: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());//4
System.out.println(stack.pop());//3
System.out.println(stack.pop());//2
System.out.println(stack.peek());//1
System.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());
}
运行结果截图
后序:
今天栈和队列的学习就告一段落了,希望这篇文章能给大家带来帮助,如果这篇文章给大家带来一定的帮助的话,期待大家的点赞,三连哦!!!⛽⛽⛽你们的支持就是我的加油站哦。