代码随想录算法训练营第9天|232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项
LeetCode232
2025-01-30 21:56:19 星期四
题目描述:力扣232
文档讲解:代码随想录(programmercarl)232.用栈实现队列
视频讲解:《代码随想录》算法视频公开课:栈的基本操作! | LeetCode:232.用栈实现队列
代码随想录视频内容简记
梳理
-
push()函数直接stackIN入栈来模拟就可以。两个栈来模拟
-
pop()函数需要用到两个栈
-
peek()函数可以直接函数复用,调用pop()函数来进行查询,之后再重新添加进去即可
-
empty()直接查询
大致代码内容
-
关于pop()函数的实现,首先要判断stackOut是否是空,只有为空才能从stackIn中弹出,
if (stackOut.empty())
-
当stackOut为空的时候,需要一次性从stackIn中弹出所有的元素,并进入stackOut。因为stackOut不为空的话顺序就不一样了。
if (stackOut.empty()) {
while (!stackIn.empty()) {
stackOut.push(stackIn.top());
stackIn.pop();
}
}
- 需要弹出stackOut的栈顶元素
int result;
int result = stackOut.top();
stackOut.pop();
LeetCode测试
点击查看代码
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if (stackOut.empty()) {
while (!stackIn.empty()) {
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result;
result = stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int result;
result = this->pop();
stackOut.push(result);
return result;
}
bool empty() {
return stackIn.empty() && stackOut.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
LeetCode225
题目描述:力扣225
文档讲解:代码随想录(programmercarl)225. 用队列实现栈
视频讲解:《代码随想录》算法视频公开课:队列的基本操作! | LeetCode:225. 用队列实现栈
代码随想录视频内容简记
用队列实现栈只需要用到一个队列就可以实现

梳理
-
push()函数直接调用队列的push()即可
-
pop()函数只需要将
-
top()实现只需要调用队列的back()函数
-
empty()就是队列的empty()函数
大致代码内容
-
实现pop()函数的时候注意我们不需要按照一个栈的顺序完整地输出,只需要弹出最后的一个元素,其余的元素顺序不变即可。
-
size = queue.size()
,首先获取队列的长度,size--
之后while (size--)
进入循环。注意在循环中不要忘了把每次弹出的元素再添加到队列中去 -
用
queue.front()
获取此时第一个元素之后,最后不要忘了用queue.pop()
弹出才能return返回
LeetCode测试
点击查看代码
class MyStack {
public:
queue<int> queue;
MyStack() {
}
void push(int x) {
queue.push(x);
}
int pop() {
int size = queue.size();
int result;
size--;
while (size--) {
result = queue.front();
queue.pop();
queue.push(result);
}
result = queue.front();
queue.pop();
return result;
}
int top() {
return queue.back();
}
bool empty() {
return queue.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
LeetCode20
题目描述:力扣20
文档讲解:代码随想录(programmercarl)20. 有效的括号
视频讲解:《代码随想录》算法视频公开课:栈的拿手好戏!| LeetCode:20. 有效的括号
代码随想录视频内容讲解
梳理
-
剪枝。这道题目可以进行剪枝的操作就是,如果这个字符串的长度不是偶数,那么就一定不是一个有效的字符串
-
三种括号类型不匹配的情况
-
左括号出现多余,例如:
([{}]
-
右括号出现多余,例如:
[{}])
-
左右括号不相等,例如:
[{)}]
-
-
首先是if判断左括号的三种情况,分别转换成右括号
-
else判断右括号,能够判断右括号出现多余和左右括号不相等的两种情况
-
循环结束,判断左括号出现多余的情况
大致代码内容
-
首先是一个for循环遍历整个字符串。如果出现对应的左括号,在栈中添加对应的右括号,这么做的目的是为了进行下一步的相等判断。出现对应的右括号,弹出栈顶元素。
-
如果右括号出现多余,
if (stack.empty())
,那么就是在遍历还未结束的时候,就出现了栈为空的情况 -
如果左右括号不相等,
if (s[i] != stack.top())
-
如果左括号不相等,则需要等待循环遍历结束之后,发现栈中不为空
LeetCode测试
在测试的时候,写成了这样的判断条件:if (s[i] != stack.top() || stack.empty())
,在遇到一个用例)[
的时候出现了

这里就是对一个空栈取元素报异常了,所以这个顺序一定不能反过来写if (stack.empty() || s[i] != stack.top())
有效的括号完整代码如下:
点击查看代码
class Solution {
public:
bool isValid(string s) {
stack<int> stack;
if (s.size() % 2 != 0) return false;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '[') stack.push(']');
else if (s[i] == '(') stack.push(')');
else if (s[i] == '{') stack.push('}');
else {
if (stack.empty() || s[i] != stack.top()) return false;
stack.pop();
}
}
if (!stack.empty()) return false;
return true;
}
};
LeetCode1047
题目描述:力扣1047
文档讲解:代码随想录(programmercarl)1047. 删除字符串中的所有相邻重复项
视频讲解:《代码随想录》算法视频公开课:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项
代码随想录视频内容简记
假设字符串为abbaca
梳理
-
为了判断一个元素有没有和他相等的在他之前出现过,需要有一个结构来进行存储之前遍历过的的元素,然后每当有元素和这个结构里的有相等,就对其进行删除。最后留下的就是不相等的元素
-
之后进入循环
-
首先是队空的情况,可以压入一个字符
-
如果字符串遍历的字符和栈顶的字符不相等,则压入一个字符;如果相等,则栈中元素弹出
-
最后返回的栈中字符,弹出后需要进行反向输出,就是原字符串
-
注意:因为最后的输出不方便,k哥最后说用字符串来模拟一个栈进行操作。也就是原字符串s依然从头部开始遍历,但是在组成result目标字符串时从尾部开始。

大致代码内容
注意:
-
if (s.empty() || s[i] != result.back()) result.push_back(s.back())
-
如果最后是相等,则
result.pop_back()
-
最后的
return
的result
就是从头部返回的ac
LeetCode测试
点击查看代码
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (int i = 0; i < s.size(); i++) {
if (result.empty() || s[i] != result.back()) result.push_back(s[i]);
else result.pop_back();
}
return result;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端