代码随想录算法训练营,9月6日 | 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
栈与队列理论基础
1.队列是先进先出,栈是先进后出
2.队列:
主要操作:
offer(): 向队列尾部添加元素。
poll(): 从队列头部移除并返回元素。
peek(): 查看队列头部的元素但不移除。
实现: 在Java中可以使用 java.util.Queue 接口的实现类(如 LinkedList、PriorityQueue 和 ArrayDeque)来使用队列。
3.栈:
主要操作:
push(): 将一个元素压入栈顶。
pop(): 从栈顶弹出一个元素。
peek(): 查看栈顶的元素但不弹出。
实现: 在Java中可以使用 java.util.Stack 类或使用 Deque 接口的实现(如 LinkedList、ArrayDeque)来模拟栈的行为。Stack 类比较老旧,不推荐使用,Deque 更灵活且高效。
232.用栈实现队列
题目链接:232.用栈实现队列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰用栈实现队列
日期:2024-09-06
想法:新建两个栈,入队列直接push元素到stIn里,出队列,如果stOut为空,就先将stIn的元素全push进stOut,stOut出一个元素,不为空直接出,队列为空,两个栈为空。
Java代码如下:
class MyQueue {
Stack<Integer> stIn;
Stack<Integer> stOut;
public MyQueue() {
stIn = new Stack<>();
stOut = new Stack<>();
}
public void push(int x) {
stIn.push(x);
}
public int pop() {
if(!stOut.isEmpty()) return stOut.pop();
else{
while(!stIn.empty()){
stOut.push(stIn.pop());
}
}
return stOut.pop();
}
public int peek() {
if(!stOut.isEmpty()) return stOut.peek();
else{
while(!stIn.empty()){
stOut.push(stIn.pop());
}
}
return stOut.peek();
}
public boolean empty() {
return stIn.isEmpty() && stOut.isEmpty();
}
}
225. 用队列实现栈
题目链接:225. 用队列实现栈
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰用队列实现栈
日期:2024-09-06
想法:可以用一个队列来实现,push操作就正常入,pop的话将队列里除最后一个的元素全部重新加到队列,然后poll出的值就是pop的值了,top也是同样想法,empty判一下空。
Java代码如下:
class MyStack {
Queue<Integer> que;
public MyStack() {
que = new LinkedList<>();
}
public void push(int x) {
que.offer(x);
}
public int pop() {
rePosition();
return que.poll();
}
public int top() {
rePosition();
int res = que.poll();
que.offer(res);
return res;
}
public boolean empty() {
return que.isEmpty();
}
private void rePosition(){
int size = que.size();
size--;
while (size-- > 0) {
que.offer(que.poll());
}
}
}
总结:top的时候没注意如果将队列顺序改了,再peek是不能实现只查不改的,这时要还原下队列,将top的那个值再塞回队列即可。
20. 有效的括号
题目链接:20. 有效的括号
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰有效的括号
日期:2024-09-06
想法:匹配类型题考虑用栈,第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
Java代码如下:
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
char[] ch = s.toCharArray();
for (int i = 0; i < s.length(); i++){
if (ch[i] == '('){
st.push(')');
}else if (ch[i] == '['){
st.push(']');
}else if (ch[i] == '{'){
st.push('}');
}else if (st.isEmpty() || st.peek() != ch[i]){
return false;
}else {
st.pop();
}
}
return st.isEmpty();
}
}
总结:要熟悉这种匹配模式的各种边界判定。
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰删除字符串中的所有相邻重复项
日期:2024-09-06
想法:用栈来存字符串中的元素,栈顶遇到相同的就删,剩下的元素如果是依次pop出就是倒序的,每一次将输出的加在最前面即可
Java代码如下:
class Solution {
public String removeDuplicates(String s) {
ArrayDeque<Character> deque = new ArrayDeque<>();
char c;
for(int i = 0; i < s.length(); i++){
c = s.charAt(i);
if(deque.isEmpty() || deque.peek() != c){
deque.push(c);
}else{
deque.pop();
}
}
String str = "";
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}
总结:Java中用ArrayDeque的情况较多,但也要注意跟LinkedList的区别,参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人