20. 有效的括号

遍历字符串,如果匹配左括号,则入栈;如果匹配右括号或者栈为空则说明不是有效括号,返回false

最后如果栈为空则说明是有效括号,否则不是有效括号

 1 class Solution {
 2 public:
 3     bool isValid(string s) {
 4         stack<char> stack;
 5         for(int i = 0; i < s.size(); i++){
 6             if(s[i] == '('){
 7                 stack.push(')');
 8             }else if(s[i] == '['){
 9                 stack.push(']');
10             }else if(s[i] == '{'){
11                 stack.push('}');
12             }else{
13                 if(!stack.empty() && stack.top() == s[i]) stack.pop();
14                 else return false;
15             }
16         }
17         return stack.empty();
18     }
19 };

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

直接创建一个新的字符串作为栈,遍历数组,如果新数组为空或者尾部与当前相同,则出栈,否则入栈

最后返回新的数组

 1 class Solution {
 2 public:
 3     string removeDuplicates(string s) {
 4         string result;
 5         for(int i = 0; i < s.size(); i++){
 6             if(result.empty() || result.back() != s[i])
 7                 result.push_back(s[i]);
 8             else
 9                 result.pop_back();
10         }
11         return result;
12     }
13 };

150. 逆波兰表达式求值

遍历数组,如果是数字,则入栈,否则用栈顶的下一个元素与栈顶元素做运算,结果再次入栈

最后返回栈顶元素

 1 class Solution {
 2 public:
 3     int evalRPN(vector<string>& tokens) {
 4         stack<long long> stack;
 5         for(int i = 0; i < tokens.size(); i++){
 6             if(tokens[i] == "+" || tokens[i] == "-" 
 7             || tokens[i] == "*" || tokens[i] == "/"){
 8                 long long num1 = stack.top();
 9                 stack.pop();
10                 long long num2 = stack.top();
11                 stack.pop();
12                 if(tokens[i] == "+")    stack.push(num2+num1);
13                 else if(tokens[i] == "-")   stack.push(num2-num1);
14                 else if(tokens[i] == "*")   stack.push(num2*num1);
15                 else stack.push(num2/num1);
16             }else{
17                 stack.push(stoll(tokens[i]));
18             }
19         }
20         return stack.top();
21     }
22 };