AB3 有效括号序列和AB4 逆波兰表达式求值

249 阅读1分钟

AB3 有效括号序列

在这里插入图片描述

关键思路:辅助栈,匹配则消掉;代码中详细解释

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValid(string s) {
        // write code here
        // 辅助栈
        stack<char> stk; // 用来存储“左” ( { [
        int lenS = s.size(); // 求出字符串的长度
        
        for (int i = 0; i < lenS; ++i) {
            switch(s[i]) {
                case '(':
                case '{':
                case '[': 
                    // 是( [ { 就push进辅助栈,等下要做比对
                    stk.push(s[i]);
                    break;
                case ')':
                    // 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
                    if (stk.empty() || stk.top() != '(') return false;
                    stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
                    break;
                // 以下都是同理
                case ']':
                    // 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
                    if (stk.empty() || stk.top() != '[') return false;
                    stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
                    break;
                case '}':
                    // 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
                    if (stk.empty() || stk.top() != '{') return false;
                    stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
                    break;
            }
        }
        
        return stk.empty(); // 最终若是有效序列,则辅助栈是空,因为都消掉了
    }
};

AB4 逆波兰表达式求值

AB4 逆波兰表达式求值

关键思路:栈,遇到数字压入栈中,遇到运算符,就弹出栈顶两个元素计算,计算后再压入栈中 先判断的是否是运算符,遇到好多坑点,注意一下;还有就是,这里有负数,所以我们用stoi这个函数来转换成数字,减少一部分麻烦;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param tokens string字符串vector 
     * @return int整型
     */
    // 默认操作有意义
    // 可能会有负数
    // 还有就是vector里面是string,不是char
    int evalRPN(vector<string>& tokens) {
        // write code here
        stack<int> stk;
        int lenT = tokens.size();
        for (int i = 0; i < lenT; ++i) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/" || tokens[i] == "*") {
                int k = stk.top();
                stk.pop();
                int x = stk.top();
                stk.pop();
                if (tokens[i][0] == '+') x += k;
                else if (tokens[i][0] == '*') x *= k;
                else if (tokens[i][0] == '-') x -= k;
                else x /= k;
                stk.push(x);
            }else {
                stk.push(stoi(tokens[i]));
            }
        }
        
        return stk.top();
    }
};