栈和队列
是一种特殊的线性表
LinkedList add/remove
常用方法 push/pop
addFisrt
addLast
一、栈:
栈顶 push 放入数据(压栈)
栈底 pop 删除数据(弹栈)
特点 先进后出
后进先出
操作:
1初始化
2压栈、弹栈
3查看当前栈顶操作
4判断为空
5返回元素个数
实现:
链表顺序表都可以实现
LinkedList链表
pushu/pop 头插头删、尾插尾删都可
ArrayList顺序表 选用尾删
Stack
自己的实现:
利用顺序表实现一个栈
class Stack{
private int[] array;
private int size;<=>top;
}[]
栈的应用:
1.后缀表达式的计算;
2.括号匹配
3.迷宫(暴力破解)
图的深度广度优先遍历 心形函数 破解栈
import java.util.LinkedList;
import java.util.Queue;
//利用队列表示栈
public class MyStack {
Queue<Integer>queue=new LinkedList<>();
public void push(int x) {
queue.add(x);
}
//删除头部元素
public int pop(int a){
int size=queue.size();
for(int i=0;i<size-1;i++){
int t=queue.poll();
queue.add(t);
//poll即删除队列的头 若为空 返回null
}
return queue.poll();
}
public int top(){
int size=queue.size();
for(int i=0;i<size-1;i++){
int t=queue.poll();
queue.add(t);
}
int v=queue.poll();
return v;
}
public boolean empty(){
queue.isEmpty();
return false;
}
}
二、队列
先进先出的队列结构
Java中的队列
Queue(interface) LinkedList(class)
Queue<String>=new LinkedList<>();
术语 队首队尾 front rear
自己实现队列 (链表实现 单项链表即足够)
头删pop
尾插 push 记录第一个和最后一个结点 这样时间复杂度即为O(1)
用数组实现队列
1不搬移
2空间浪费
3只有rear走到最后搬移一次
4循环队列
size
空一个位置不用
rear=(rear-1)%容量
import java.util.Stack;
public class MyQueue {
private Stack<Integer>stack1=new Stack<>();
private Stack<Integer>stack2=new Stack<>();
public void push(int x){
stack1.push(x);
}
public int pop(){
//判断stack2是否空
if( stack2.empty()) {
while (!stack1.empty()) {
int t = stack2.pop();
stack2.push(t);
}
}
//返回删除后的
return stack2.pop();
}
public int peek(){
if( stack2.empty()) {
while (!stack1.empty()) {
int t = stack2.pop();
stack2.push(t);
}
}
//返回
return stack2.peek();
}
public boolean empty(){
return stack1.empty()&&stack2.empty();
}
}