## day11 - 栈与队列part02

发布时间 2023-09-18 13:36:06作者: 笑忘书丶丶

day11 - 栈与队列part02

力扣20. 有效的括号

思路: 利用栈的特性,遇见左括号就把右括号压栈,遇见右括号,就对比和栈顶元素是否相同,不同就返回false。

代码

class Solution {
public:

    stack<int> st;

    bool isValid(string s) {
        if (s.size() % 2 != 0)
        {
            return false;
        }
        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. 删除字符串中的所有相邻重复项

思路:将字符串压栈,如果字符和栈顶字符相同,就不压栈并且弹出栈顶元素。

然后输出栈里的元素到字符串,然后反转字符串。

优化,直接将字符串作为栈,开始操作。

注意string类型底层是vector

class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (int i = 0; i < s.size(); i++)
        {
            if (result.empty() || result.back() != s[i])
            {
                result += s[i];
            }
            else
            {
                result.pop_back();
            }
        }
        return result;
    }
};

力扣150. 逆波兰表达式求值

思路:栈操作,如果遇见运算符,那么弹出前面两个元素进行运算,再把结果压栈。

代码

    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] == "/")
            {
                //注意,比如1 2 - 弹出来是 1 - 2 ,所以要用后弹出来的放前面。
                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]));
            }
        }
        return st.top();
    }