一、栈
栈(stack)是运算受限的线性表,只允许在表的一端进行添加和删除(先进后出,后进先出)
插入删除的一端叫做栈顶(top),表的另一端叫栈底(bottom)
插入–>进栈(push)
删除–>出栈(pop)
得到栈顶元素(Peek)
栈的存储结构
顺序栈,类似于顺序表,底层使用数组
链栈,类似于单链表,节点
二、队列
队列(queue)简称队,也是一种运算受限的线性表,只允许在表的一端进行插入,另一端删除。把插入数据元素的一端称为队尾(rear),删除数据的一端叫队首(front)。先进先出
队列的存储结构
1.顺序队列
1.1使用数组作为存储结构
缺点:出队操作后,front之前的空间不能再次得到,导致空间大量丢失
1.2使用循环数组
可以再次使用front之前的空间
2.链式队列
使用带头节点的单链表
链表的头部作为队首,尾部作为队尾
队首指针指向队首元素的前一个结点,队尾指针指向队尾元素所在的节点
队列为空时,队首和队尾指针指向头节点
3.双端队列deque
两端都可以进行进队和出队的操作,将队列的两端分为前端和后端,逻辑上仍是线性结构
双端队列既可以用于队操作,也可用于栈操作(只操作一端)
Java中的队列和栈
Stack:栈类,已过时,底层是Vector
Queue:队列类
Deque:双端队列(也可用于栈操作)
Java中栈和队列都可以通过LinkedList类实现(底层链表),ArrayDeque也可实现(底层线性表)
package com.liang.datastructure.stackQueue;
import java.util.ArrayDeque;
import java.util.Deque;
public class Demo {
public static void main(String[] args) {
int n=128;
Deque<Integer> stack=new ArrayDeque<Integer>();
int t=n;
do {
int mod=t%2;
stack.push(mod);
t=t/2;
}while(t>0);
System.out.print(n+"--->");
while(!stack.isEmpty()) {
System.out.print(stack.pop());
}
}
}