20. 有效的括号
力扣题目链接
文章讲解
栈的拿手好戏!| LeetCode:20. 有效的括号

#include <iostream>
#include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
if ((s.size() % 2) != 0) {
return false;
}
stack<char> st;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
st.push(')');
}
else if (s[i] == '{') {
st.push('}');
}
else if (s[i] == '[') {
st.push(']');
}
else if (st.empty() || st.top() != s[i]) {
return false;
}
else {
st.pop();
}
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
力扣题目链接
文章讲解
栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项

string removeDuplicates(string s) {
stack<char> st;
for(char snum : s) {
if (st.empty() || snum != st.top()) {
st.push(snum);
}
else {
st.pop();
}
}
string result = "";
while (!st.empty()) {
result += st.top();
st.pop();
}
reverse(result.begin(), result.end());
return result;
}
150. 逆波兰表达式求值
力扣题目链接
文章讲解
栈的最后表演! | LeetCode:150. 逆波兰表达式求值

class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for (int i = 0; i < tokens.size(); ++i) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
if (tokens[i] == "+") {
st.push(num2 + num1);
}
if (tokens[i] == "-") {
st.push(num2 - num1);
}
if (tokens[i] == "*") {
st.push(num2 * num1);
}
if (tokens[i] == "/") {
st.push(num2 / num1);
}
} else {
st.push(stoll(tokens[i]));
}
}
int result = st.top();
st.pop();
return result;
}