栈(Stack)和队列(Queue)
一 栈(Stack):一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一
端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出。
压栈:栈的插入操作也叫入栈,进栈,压栈。出栈:栈的删除操作也叫出栈。
方法:
stack.push(); 压栈stack.pop(); 查看栈顶元素并删除stack.peek(); 查看栈顶元素不删除stack.empty 栈是否为空
二 队列(Queue):只允许在一端进行插入数据,另一端进行删除数据操作的特殊线性表,队列中的元素遵循先进先出。
入队列:队尾插入;出队列:队头删除;
方法:
常用:
Queue.offer(); 压栈Queue.poll(); 查看栈顶元素并删除Queue.peek(); 查看栈顶元素不删除
抛异常:Queue.add(); 压栈Queue.remove(); 查看栈顶元素并删除Queue.element(); 查看栈顶元素不删除
三 双端队列(Deque):两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。那就说明元
素可以从队头出队和入队,也可以从队尾出队和入队。
方法:常用: 抛异常:入队列:队首: offerFirst(); addFirst();队尾:offerLast(); addLast();
出队列: 队首: pollFirst(); removeFirst();队尾: pollLast(); removeLast();
获取元素: 队首: peekFirst(); getFirst();队尾:peekLast(); getLast();
试题
1 括号匹配问题
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch=='('||ch=='['||ch=='{'){
stack.push(ch);
}else {
if (stack.empty()){
System.out.println("右括号多");
return false;
}
char top=stack.peek();
if (top=='('&&ch==')'||top=='['&&ch==']'||top=='{'&&ch=='}'){
stack.pop();
}else {
System.out.println("左右括号不匹配");
return false;
}
}
}
if (!stack.empty()){
System.out.println("左括号多");
return false;
}
return true;
}
}
2 循环队列
class MyCircularQueue {
public int[] elem;
public int front; //队头下标
public int rear; //队尾下标
public MyCircularQueue(int k) {
this.elem=new int[k+1];
}
public boolean enQueue(int value) {
if (isFull()) return false;
this.elem [rear]=value;
rear=(rear+1)% elem.length;
return true;
}
public boolean deQueue() {
if (isEmpty()) return false;
front=(front+1)% elem.length;
return true;
}
//队首获取元素
public int Front() {
if (isEmpty())return -1;
return elem[front];
}
//队尾获取元素
public int Rear() {
if (isEmpty())
return -1;
int index = -1;
if (rear==0){
index= elem.length-1;
}else {
index= rear-1;
}
return elem[index];
}
public boolean isEmpty() {
return front==rear;
}
public boolean isFull() {
if ((rear+1)%elem.length==front){
return true;
}
return false;
}
3 队列实现栈
public class MinStack { public Queue<Integer> qu1; public Queue<Integer> qu2; public MinStack() { qu1=new LinkedList<>(); qu2=new LinkedList<>(); } public void push(int x) { if (qu1.isEmpty()){ qu1.offer(x); }else if (qu2.isEmpty()){ qu2.offer(x); } qu1.offer(x); } public int pop() { if (empty())return -1; if (!qu1.isEmpty()){ int size=qu1.size()-1; for (int i = 0; i < size; i++) { int val =qu1.poll(); qu2.offer(val); } return qu1.poll(); } if (!qu2.isEmpty()){ int size=qu2.size()-1; for (int i = 0; i < size; i++) { int val=qu2.poll(); qu1.offer(val); } return qu2.poll(); } return -1; } public int top() { if (empty())return -1; int val=-1; if (!qu1.isEmpty()){ int size= qu1.size(); for (int i = 0; i<size; i++) { val =qu1.poll(); qu2.offer(val); } return val; } if (!qu2.isEmpty()){ int size= qu2.size(); for (int i = 0; i < size; i++) { val=qu2.poll(); qu1.offer(val); } return val; } return -1; } public boolean empty() { return qu1.isEmpty() && qu2.isEmpty(); } }
4 栈实现队列
class MyQueue { public Stack<Integer>stack1; public Stack<Integer>stack2; public MyQueue() { stack1 =new Stack<>(); stack2 =new Stack<>(); } public void push(int x) { stack1.push(x); } public int pop() { if (empty())return -1; while (stack2.isEmpty()){ if (!stack1.isEmpty()){ stack2.push(stack1.pop()); } } return stack2.pop(); } public int peek() { if (empty())return-1 ; while (stack2.isEmpty()){ if (!stack1.isEmpty()){ stack2.push(stack1.pop()); } } return stack2.peek(); } public boolean empty() { return stack1.isEmpty() &&stack2.empty(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现