【栈和队列刷题】 有效的括号、删除字符串中的所有相邻重复项、用栈实现队列、用队列实现栈
创始人
2024-02-18 03:56:23
0

LeetCode20. 有效的括号

来源:力扣(LeetCode)
链接:link
思路:使用一个栈,遍历字符串。如果栈为空就直接将字符加入。如果不为空,判断字符是左字符还是右字符。如果是左字符,直接加入;如果是右字符,判断与栈顶字符是否匹配,若不匹配,直接返回false,若匹配则移除栈顶。循环直到字符串遍历完毕。最后如果栈为空,说明括号有效。

class Solution {
public:bool isValid(string s) {stack sk;if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求for(int i = 0; i < s.size(); i++){if(s[i] == '(' || s[i] == '{' || s[i] == '[') sk.push(s[i]);else{if(!sk.empty() && ((sk.top() == '(' && s[i] == ')') ||(sk.top() == '{' && s[i] == '}') ||(sk.top() == '[' && s[i] == ']'))) sk.pop();else return false;}}if(sk.empty()) return true;else return false;}
};

LeetCode1047. 删除字符串中的所有相邻重复项

来源:力扣(LeetCode)
链接:link
思路:借助栈,遍历字符串。如果栈顶字符和当前字符一致,直接pop;否则入栈。

class Solution {
public:string removeDuplicates(string s) {stack sk;string result;for(auto e : s){if(sk.empty() || sk.top() != e) sk.push(e);else sk.pop();}while(!sk.empty()){result += sk.top();sk.pop();}reverse(result.begin(), result.end());return result;}
};

LeetCode232.用栈实现队列

来源:力扣(LeetCode)
链接:link
思路:使用栈来模拟队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。

class MyQueue {
public:stack instack, outstack;MyQueue() {}void push(int x) {instack.push(x);}int pop() {if(outstack.empty()){while(!instack.empty()){outstack.push(instack.top());instack.pop();}}int res = outstack.top();outstack.pop();return res;}int peek() {int res = pop();outstack.push(res);return res;}bool empty() {return instack.empty() && outstack.empty();}
};

LeetCode225. 用队列实现栈

来源:力扣(LeetCode)
链接:link
思路:队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用又来备份的!

class MyStack {
public:queue inqueue, outqueue;//int size;MyStack() {//size = 0;}void push(int x) {inqueue.push(x);//size++;}int pop() {int size = inqueue.size();size--;while(size--){outqueue.push(inqueue.front());inqueue.pop();}int res = inqueue.front();inqueue.pop();while(!outqueue.empty()){inqueue.push(outqueue.front());outqueue.pop();}return res;}int top() {//int res = pop();//inqueue.push(res);//return res;return inqueue.back();}bool empty() {return inqueue.empty();}
};

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...