day11第五章 栈与队列part02

栈与队列part02

1.有效的括号

题目https://leetcode.cn/problems/valid-parentheses/

class Solution {

public:

  bool isValid(string s) {

​    stack<char> st;//stack<int>时存入栈的是字母的acsii码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()||st.top()!=s[i]) return false;//先判断是否为空栈,栈已经空了,但字符串还有,说明右符号多余//再判断字符串里剩余未遍历右符号是否与存入栈里的右符号(同字符串左符号匹配的)相同else  st.pop();//st.top()=s[i],说明左右符号配对,栈弹出元素,继续遍历}return st.empty();//若字符串遍历完了,栈里面还有,说明左符号多余(字符串里多少左符号->栈大小)//若匹配成功,应为空栈,return 0

  }

};

盲点:

1.匹配成功

需要先左后右且左右要匹配

2.不匹配分类三种

a.字符串里左方向的括号多余了

https://code-thinking-1253855093.file.myqcloud.com/pics/2020080915505387.png

b.括号没有多余,但是 括号的类型没有匹配上

https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155107397.png

c.字符串里右方向的括号多余了

https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155115779.png

3.栈的大小

栈用来存字符串遍历到左符号对应的右符号,所以栈的大小由字符串里有多少左符号决定

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

题目https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

示意图https://code-thinking.cdn.bcebos.com/gifs/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.gif

题解

class Solution {

public:

  string removeDuplicates(string S) {

​    string result;for(char s:S){if(result.empty()||result.back()!=s){//result里没有当前遍历到的元素

​        result.push_back(s);//放入result}else{//result里有当前遍历到的元素

​        result.pop_back();//弹出该元素,即消除两个一样的}}return result;

  }

};

盲点:

1.为什么用字符串存储

字符串是正序的,将其输入栈再从栈中弹出剩余元素,是倒序的,需要再对字符串进行反转一下;

所以可以拿字符串直接作为栈

3. 逆波兰表达式求值

题目https://leetcode.cn/problems/evaluate-reverse-polish-notation/

示意图https://code-thinking.cdn.bcebos.com/gifs/150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.gif

题解

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 num1=st.top();//遇到符号就取栈里最近两个数

​        st.pop();long long num2=st.top();

​        st.pop();if(tokens[i]=="+") st.push(num1+num2);if(tokens[i]=="-") st.push(num2-num1);//num1num2顺序??  if(tokens[i]=="*") st.push(num1*num2);if(tokens[i]=="/") st.push(num2/num1);}else{//遇到数字就push进栈里

​        st.push(stoll(tokens[i]));}}int result=st.top();//最后栈里留下数字为表达式结果

​    st.pop();return result;

  }

};

盲点:

1.//num1num2顺序??
 if(tokens[i]=="+") st.push(num1+num2);  

 if(tokens[i]=="-") st.push(num2-num1);//num1num2顺序??  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值