● 20. 有效的括号
● 1047. 删除字符串中的所有相邻重复项
● 150. 逆波兰表达式求值
20. 有效的括号(记忆)
描述:
1.栈
2.反向放入元素‘{’---> }
3.放入后,遇到s[i]中的 } 去弹出 栈 中的};
4.如果不匹配,立刻返回false
特殊情况:
1.遍历右括号中,已经空了
2.遍历右括号中,与stack.top()不匹配
3.遍历完了,栈中还有元素
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
class Solution {
public:
bool isValid(string s) {
stack<char>a;
for(int i = 0; i<s.size();i++){
if(s[i] =='(') a.push(')');
else if (s[i]=='[') a.push(']');
else if(s[i]=='{') a.push('}');
//以下都是匹配右括号了
else if(a.empty()||a.top()!=s[i]) return false; //此时都是右括号(a空 或者不等top的情况)
else a.pop();
}
return a.empty(); //最后清空了么?
}
};
- 时间复杂度: O(n)
- 空间复杂度: O(n)
1047. 删除字符串中的所有相邻重复项
题目理解:如图
解题思维:
1.辅助栈
2.只要栈不空,每次待加入元素,先和top比较
3. 不同:入 同:出
4.栈转字符串 + 反转
class Solution {
public:
string removeDuplicates(string s) {
if(s.size() == 1)
return s;
stack<char> My;
for(int i = 0; i < s.size(); i++) {
if(!My.empty() && s[i] == My.top()) {
My.pop();
}
else {
My.push(s[i]);
}
}
// 将栈中的元素转化为字符串,并倒序
string result;
while(!My.empty()) {
result += My.top();
My.pop();
}
// 由于栈的性质是先进后出,结果需要倒序
reverse(result.begin(), result.end());
return result;
}
};
用string充当 stack:
STL: pop_back()
push_back()
class Solution {
public:
string removeDuplicates(string S) {
string result;
for(char s : S) {
if(!result.empty()&& result.back() == s) {
result.pop_back();
}
else {
result.push_back(s);
}
}
return result;
}
};
150. 逆波兰表达式求值(计算机计算思维,后缀)
1.遇到数字就加入
2.遇到+-*/ 就弹出两个数字(nums2 是右操作数)
3.运算结束再push进去
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> a;
for(int i = 0; i < tokens.size(); i++) {
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
long long nums2 = a.top(); a.pop();
long long nums1 = a.top(); a.pop();
if(tokens[i] == "+") a.push(nums1 + nums2);
else if(tokens[i] == "-") a.push(nums1 - nums2);
else if(tokens[i] == "*") a.push(nums1 * nums2);
else if(tokens[i] == "/") a.push(nums1 / nums2);
} else {
a.push(stoll(tokens[i]));
}
}
return a.top();
}
};