代码随想录第十一天 | 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项
第一题232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
package stack;
import java.util.Stack;
public class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);// 把元素放到入栈里
}
public int pop() {
if(stackOut.empty()){
//如果stackOut为空的话,把stackIn的元素全部加到stackOut里面
while (!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
Integer res = stackOut.peek();//把要弹出的元素标记为res
stackOut.pop();//弹出该元素
return res;
}
public int peek() {
int res = this.pop();//调用弹出函数
stackOut.push(res);
return res;
}
public boolean empty() {
if(stackIn.empty()&&stackOut.empty()){
return true;
} else {
return false;
}
}
}
第二题225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
package stackandqueue;
import java.util.ArrayDeque;
import java.util.Deque;
public class MyStack {
Deque<Integer> queue;
public MyStack() {
queue = new ArrayDeque<>();
}
public void push(int x) {
queue.addLast(x);
}
public int pop() {
int size = queue.size();//队列的大小
size--;
while (size-->0){
queue.addLast(queue.pollFirst());//把要弹出的数前面的数全部弹出后加到队尾
}
int res = queue.pollFirst();//给弹出的数赋值
return res;
}
public int top() {
Integer res = queue.removeLast();//检索并删除队列的最后一个元素
queue.addLast(res);//再把最后一个元素加到队列尾部
return res;
}
public boolean empty() {
return queue.isEmpty();
}
}
- 题目本身是不难的,但是我没有用过Deque这个类,还是改了好几遍
第三题20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
package stackandqueue;
import java.util.Stack;
public class IsValid {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
if (s.length() % 2 != 0) {
return false;//不成对的直接返回false
}
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(')');
} else if (s.charAt(i) == '[') {
stack.push(']');
} else if (s.charAt(i) == '{') {
stack.push('}');
} else if (stack.empty()) {
return false;// 右括号多
} else if (!stack.peek().equals(s.charAt(i))) {
return false;//如果接下来的右括号不是栈顶的元素,返回false
} else if (stack.peek().equals(s.charAt(i))) {
stack.pop();//匹配则弹出
}
}
if (!stack.empty()) {
return false;//左括号多
}
return true;
}
}
- 三种情况,要么左括号多,要么右括号多,要么左右括号类型不匹配
第四题1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
ψ(`∇´)ψ 我的思路
- 今天独立完成的第一道题,解题思路与上一题相似,但比上一题简单
- 读题后的第一想法是字符串对称,但是实现非常困难,栈的结构就很巧妙的解决这个问题
package stackandqueue;
import java.util.Stack;
public class RemoveDuplicates {
public static String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (stack.empty()||!(stack.peek().equals(s.charAt(i)))){
stack.push(s.charAt(i));//栈为空或接下来的元素和栈顶元素不同,元素入栈
} else {
stack.pop();//如果接下来的元素和栈顶元素相同的话,栈顶元素出栈
}
}
StringBuilder sb = new StringBuilder();
while (!stack.empty()) {
sb.append(stack.pop().charValue());
}
return sb.reverse().toString();
}
}
时间复杂度为O(n)
总结
-
今天前三道题都不是自己做出来的,主要还是对栈和队列的用法不熟悉,不知道该往哪个地方想,做到后面就好一点
-
看了一下明天有困难题欸😍,小刘小刘,加油加油!!!
分类:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?