训练营day11|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号

  • 题目链接20. 有效的括号
  • 独立思路:遇到左括号,压入栈。遇到右括号,若栈顶元素与其相匹配,则弹出;若不匹配,则返回false
  • 问题(已解决):有①②两处忘记判断栈是否为空。① 遇到右括号时,若栈内为空,直接读top会出错!②for循环结束之后,还需要检查一遍栈是否为空,若还有剩余则还是还是false
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
// 正确的顺序是啥意思,() < [] < {}? 还是只要括号相匹配就行?
// 遇到左括号,压入栈。遇到右括号,若栈顶元素与其相匹配,则弹出;若不匹配,则返回false

class Solution {
public:
    bool isValid(string s) {
        stack<char> parenthesis;
        for(auto ch : s){   //遇到左括号入栈
            if(ch == '(' || ch == '[' || ch == '{'){
                parenthesis.push(ch);
            }
            else{           //遇到右括号判断
                if(parenthesis.empty())   //①  
                    return false;
                if(ch == ')' && parenthesis.top() != '(')
                    return false;
                if(ch == ']' && parenthesis.top() != '[')
                    return false;
                if(ch == '}' && parenthesis.top() != '{')
                    return false;
                parenthesis.pop();
            }
        }
        
        if(parenthesis.empty())	//②
            return true;
        return false;
    }
};

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

  • 题目链接1047. 删除字符串中的所有相邻重复项
  • 独立思路:遍历s字符依次入栈,①栈空,直接入栈 ②与栈顶元素相等,直接pop掉。
  • 问题(已解决):创建一个栈会超出内存限制。直接定义string ans就行,string本身就有pop_back、push_back、back等和栈类似的操作
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
//遍历s字符依次入栈,①栈空,直接入栈 ②与栈顶元素相等,直接pop掉.
//结束之后,元素依次出栈,组成字符串ans,最后逆转ans
class Solution {
public:
    string removeDuplicates(string s) {
        string ans;

        for(auto ch : s){
            if(!ans.empty() && ans.back() == ch)
                ans.pop_back();
            else
                ans.push_back(ch);
        }

        return ans;
    }
};

150. 逆波兰表达式求值

  • 题目链接150. 逆波兰表达式求值
  • 独立思路:扫描表达式,遇到数字入栈,遇到运算符~时,从栈中依次pop出两个数a与b,进行b~a,再压入栈。直到扫描完毕,栈内仅有一个数字时,返回该数字。
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
//逆波兰表达式 = 后缀表达式
//扫描表达式,遇到数字入栈,遇到运算符~时,从栈中依次pop出两个数a与b,进行b~a,再压入栈。
//直到扫描完毕,栈内仅有一个数字时,返回该数字。
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> num;

        for(auto x : tokens){
            if(x == "+"){
                int a = num.top();  num.pop();
                int b = num.top();  num.pop();
                num.push(b+a);
            }
            else if(x == "-"){
                int a = num.top();  num.pop();
                int b = num.top();  num.pop();
                num.push(b-a);
            }
            else if(x == "*"){
                int a = num.top();  num.pop();
                int b = num.top();  num.pop();
                num.push(b*a);
            }
            else if(x == "/"){
                int a = num.top();  num.pop();
                int b = num.top();  num.pop();
                num.push(b/a);
            }
            else{       //x为数字
                num.push(stoi(x));    
            }
        }
            
        return num.top();

    }
};
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值