220有效的括号&1047删除字符串中的所有相邻重复项&150逆波兰表达式求值

 

day11


20.有效的括号

题目链接:20. 有效的括号

题目思路:使用栈的思路,碰到左括号,就将对应的右括号压入栈,判断栈是否为空,或者栈顶元素是否等于第i个。

class Solution {
public:
    bool isValid(string s) {
        // 定义栈
        stack<int> st;
        // 如果为奇数个直接返回false,肯定不匹配
        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() || s[i] != st.top()) return false;
            else st.pop(); //如果都不满足删除栈顶元素,也就是说这种是s[i] == st.top()的情况,移除栈顶元素
        }
        return st.empty();
    }
};

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

题目链接:1047. 删除字符串中的所有相邻重复项

解题思路:借用栈的方法,将没有出现过的元素都加入栈,出现过的元素直接弹出栈,最终得到结果,注意这块栈如何变为字符串,第一次不会写。

注意:这里可以直接将字符串作为栈

class Solution {
public:
    string removeDuplicates(string s) {
        if (s.size() == 1) return s;
        // 定义一个栈
        stack<int> st;
        for ( int i = 0; i < s.size() ; i++){
            // 如果栈为空
            if ( st.empty() || s[i] != st.top() ){
                st.push(s[i]);
            }
            else if ( s[i] == st.top()){
                st.pop();
            }
            // else if ( s[i] != st.top() ){
            //     st.push(s[i]);
            // }
        }
        // 将栈转换为字符串后再反转。
        string result = "";
        while( !st.empty()){ //将栈中的元素result字符串汇总
            result += st.top();
            st.pop();
        }
        reverse( result.begin(),result.end());//此时字符串需要反转
        return result;

    }
};

		//直接将字符串作为栈来解决
        string result;
        for( char t: s){
            if ( result.empty() || result.back() != t){ //.back() 返回最后一个元素
                result.push_back(t); //在容器对象的末尾插入一个新元素
            }
            else{
                result.pop_back(); //删除容器对象的最后一个元素
            }
        }
        return result;


150.逆波兰表达式求值

题目链接: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 nums1 = st.top();
                st.pop();
                long long nums2 = st.top();
                st.pop();
                // 注意-和÷的先后顺序
                if  (tokens[i] == "+" ) st.push( nums2 + nums1);
                else if ( tokens[i] == "-" ) st.push( nums2 - nums1 );
                else if ( tokens[i] == "*"  ) st.push( nums2 * nums1 );
                else if ( tokens[i] == "/") st.push( nums2 / nums1 );
            }
            else{
                st.push( stoll(tokens[i]));
            }
        }
        int result = st.top();
        st.pop();
        return result;

    }
};
// long long 占用8字节64位
// int 占用4字节 32位
// stoll 同 int 转换,只是范围不一样 stoll-> long long型