栈(Stack)和队列(Queue)
2022/8/24 6:52:56
本文主要是介绍栈(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(); }
这篇关于栈(Stack)和队列(Queue)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27文件掩码什么意思?-icode9专业技术文章分享
- 2024-12-27如何使用循环来处理多个订单的退款请求,代码怎么写?-icode9专业技术文章分享
- 2024-12-27VSCode 在编辑时切换到另一个文件后再切回来如何保持在原来的位置?-icode9专业技术文章分享
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解