(栈) 20. Valid Parentheses, 150. Evaluate Reverse Polish Notation, 71. Simplify Path

注意:!!当字符串的某一字符为 )}  ] 时要先判断栈st是否为空,若为空则返回false,否则st.pop()时容易造成指针溢出报错。

class Solution {
public:
    bool isValid(string s) {
        if(s.empty())
            return true;
        stack<char> st;
        for(auto a : s){
            if(a=='(' || a=='['|| a=='{')
                st.push(a);
            else 
            {
                if(st.empty())  //注意判断栈是否为空,否则st.pop()会导致内存泄漏
                    return false;
                else if(a==')')
                {
                if(st.top()== '(')
                    st.pop();
                else
                    return false;
                }
                else if(a=='}'){
                if(st.top() == '{')
                    st.pop();
                else
                    return false;
                }
                else{
                if(st.top()== '[')
                    st.pop();
                else
                    return false;
                }
            }
        }
        
        if(st.empty())
            return true;
        else
            return false;
    }
};
class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(int i=0; i<s.size(); i++){
            if(s[i] == '(' || s[i] == '{'|| s[i] == '[')
                st.push(s[i]);
            else{
                //不要忘记判断边界条件
                if(st.size() == 0)
                    return false;
                
                char c = st.top();
                st.pop();
                
                char match;
                if(s[i]==')')
                    match = '(';
                else if(s[i]=='}')
                    match = '{';
                else
                {
                    assert(s[i]==']');
                    match = '[';
                    
                }
                if(c != match)
                    return false;
            }
        }
        if(st.size() != 0)
            return false;
        return true;
    }
    
};

思路:从前往后遍历数组,遇到数字则压入栈中,遇到符号则把栈顶的两个数字拿出来做运算,把结果再压入栈中,直到遍历完整个数组,栈顶数字就是答案。

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

.. 回退一个目录 

思路:使用stringstream来分割字符串,使用字符串t来保存每一段,然后分布处理:当中间是“.”就要直接去掉;多个“/”只保留一个;“..”是回退上一级的意思,即若栈不为空,弹出栈顶元素;最后,将符合要求的字符串压入栈。

class Solution {
public:
    string simplifyPath(string path) {
        string res, t;
        stringstream ss(path);
        vector<string> v;
        
        while(getline(ss,t,'/')){  //以 / 来分割ss,获得的字符串赋给t
            if(t == "" || t == ".") continue;  //跳出本次循环,执行下一个循环
            else if(t != ".." ) 
                v.push_back(t);
            else if(!v.empty())
                v.pop_back();  
        }
        
        for(string s:v)
            res += "/" + s;
        return res.empty() ? "/" : res;
    }
};
原文地址:https://www.cnblogs.com/Bella2017/p/10278086.html