day11 栈与队列2

第一题:有效的括号

1.首先理清楚不匹配有哪些情况:

情况0:如果字符串的长度为奇数,肯定不匹配

情况1:字符串里左方向的括号多余了,所以不匹配

情况2:括号里没有多余,但是括号的类型不匹配

情况3:字符串里右方向的括号多余了,不匹配

2.入栈的内容也不是有啥入啥,而是从左开始,第一个元素是(,入栈的内容就是),然后到了右方向的时候弹出);

3.思路:如果字符串正确的话,肯定是先左方向,然后右方向,所以先根据左方向的情况把相匹配的右方向放进栈里,然后到了右方向如果相同则依次弹出,最后检查是否还有剩余,如果没有说明匹配成功

第二题:删除字符串中所有的相邻重复项

1.如同消消乐,abbaca消除之后就是ca,首先bb消除后就是aaca,然后消除aa,最后只剩ca

2.代码思想:用一个栈依次将字符串中的元素存进去,如果新的元素等于栈顶元素st.top(),也就跟前一个进去的元素相等,就弹出前一个进去的元素

3.最后检查栈是否还有元素,如果有用一个string保存下来,记得栈是先进后出,所以string要反转

利用reverse(s.begin(),s.end())函数反转

class Solution {
public:
    string removeDuplicates(string s) {
       stack<char> st;
       for(char ch:s)
       {
           if(st.empty()||ch!=st.top())
           {
               st.push(ch);
           }
           else
           {
               st.pop();// ch 与 st.top()相等的情况
           }
       }
       string result="";
       while(!st.empty())
       {
           result+=st.top(); // 将栈中元素放到result字符串汇总
           st.pop();
       }

       reverse(result.begin(),result.end());
       return result;

    }
};

注意黑色箭头对应的才是st.top()

第三题:逆波兰表达式求值

1.和上一题思路差不多,遇上+-*/就进行一次计算消除,然后把计算结果放进栈里

思路:1、创建一个栈;

        2、对字符串每个元素循环

        3、如果字符等于+-*/,进入条件语句,将前一个元素存进long long num1中,然后将其弹出,将下一个元素存进long long num2中,再将其弹出

        4、对出现的运算符做判断,比如是+,则 将num1+num2的结果Push进栈内

        5、不满足条件语句的,依次Push进栈内

        6、最后用一个元素将栈内剩下的结果保存出来,返回时用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值