【Leetcode算法day11】

本文介绍了使用栈解决有效括号问题、删除字符串中相邻重复项以及逆波兰表达式求值的方法。在有效括号问题中,关键在于正确处理栈的顺序;删除重复项时,利用栈存储字符并移除相邻重复;在逆波兰表达式中,栈用于存储数值和运算符,确保计算正确性。
摘要由CSDN通过智能技术生成

代码随想录打卡day11

栈与队列2

1.20有效的括号
一个问题卡了很久,空栈判断要在前!!否则可能会操作空栈报错,即case2放case1前就没事

class Solution {
public:
    bool isValid(string s) {
        stack<char> mySymbol;
        if(s.size()%2){//为奇数则直接剪枝
            return false;
        }
        //true 遍历完而且栈空
        //case1 遍历时遇到不匹配的
        //case2 遍历未结束栈先空;右边多
        //case3 遍历结束栈未空;左边多
        for(char c : s){
            if(c == '('){
                mySymbol.push(')');}
            else if(c == '['){
                mySymbol.push(']');}
            else if(c == '{'){
                mySymbol.push('}');}
            else if(mySymbol.empty()){//case2
                return false;
            }
            else if(c != mySymbol.top()){//case1
                return false;
            }
            else{
                mySymbol.pop();
            }
        }
        return mySymbol.empty();//case3
    }
};

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

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        string result;
        for(char c : s){
            if( !st.empty() && st.top() == c){
                st.pop();
                
            }else{
                st.push(c);
            }
        }
        while(!st.empty()){
            result += st.top();
            st.pop();
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

3.150逆波兰表达式求值
判断一个字符是不是数字
最好是把结果和过程数 abc这三个数都取long类型,以免运算中途超过int范围。

#include <cctype>
isdigit(s)
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        int a,b,c;
        for(string s : tokens){
            if(s == "+" || s == "-" || s == "*" || s == "/"){//是运算符
                b = st.top();
                st.pop();
                a = st.top();
                st.pop();
                if(s == "+"){c = a + b;}
                else if(s == "-"){c = a - b;}
                else if(s == "*"){c = a * b;}
                else {c = a / b;}
                st.push(c);
            }
            else{//是数字
                st.push(stoi(s));
            } 
        }
        c = st.top();
        st.pop();
        return c;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值