当前位置:   article > 正文

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

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

加油,又是奋起直追的一天!

LeetCode 20.有效的括号

题目链接:

20. 有效的括号 - 力扣(LeetCode)

解题思路:

用一个栈来存储前括号,当字符元素为前括号时,将其压入栈,当字符元素为后括号时,判读是否栈内元素与其相对应,如果不对应直接返回false,注意,测试案例可能出现“)”这种单个后括号的情况,这时候判断条件就得加一个是否在栈空的情况下,碰到后括号,此时也返回false。

代码:

  1. class Solution {
  2. public:
  3. bool isValid(string s) {
  4. stack<char>st;
  5. int len = s.size();
  6. for(int i=0;i<len;i++){
  7. if(s[i]=='('||s[i]=='['||s[i]=='{'){
  8. st.push(s[i]);
  9. }
  10. if(s[i]==')'){
  11. if(st.empty()||st.top()!='('){
  12. return false;
  13. }
  14. else{
  15. st.pop();
  16. }
  17. }
  18. if(s[i]==']'){
  19. if(st.empty()||st.top()!='['){
  20. return false;
  21. }
  22. else{
  23. st.pop();
  24. }
  25. }
  26. if(s[i]=='}'){
  27. if(st.empty()||st.top()!='{'){
  28. return false;
  29. }
  30. else{
  31. st.pop();
  32. }
  33. }
  34. }
  35. return st.empty()?true:false;
  36. }
  37. };

第二种解题思路:

当为前括号时,栈内插入其对应的后括号。当遇见后括号时,判断栈顶元素是否是对应插入的后括号,若不相等,则返回false。

代码:

  1. class Solution {
  2. public:
  3. bool isValid(string s) {
  4. stack<char>st;
  5. int len = s.size();
  6. if(len%2!=0) return false;
  7. for(int i=0;i<len;i++){
  8. if(s[i]=='(') st.push(')');
  9. else if(s[i]=='[') st.push(']');
  10. else if(s[i]=='{') st.push('}');
  11. else if(st.empty()||s[i]!=st.top()) return false;
  12. else st.pop();
  13. }
  14. return st.empty();
  15. }
  16. };

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

题目链接:

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

解题思路:

设计一个栈存储元素,当插入元素和栈顶元素相同时,栈顶元素弹出,否则将新元素插入进去。注意当栈为空时要单独考虑,否则会存在空指针的情况。

代码:
 

  1. class Solution {
  2. public:
  3. string removeDuplicates(string s) {
  4. stack<char>st;
  5. for(int i=0;i<s.size();i++){
  6. if(st.empty()){
  7. st.push(s[i]);
  8. }
  9. else{
  10. if(s[i]==st.top()){
  11. st.pop();
  12. }
  13. else st.push(s[i]);
  14. }
  15. }
  16. string ans;
  17. while(!st.empty()){
  18. ans+=st.top();
  19. st.pop();
  20. }
  21. reverse(ans.begin(),ans.end());
  22. return ans;
  23. }
  24. };

LeetCode 150.逆波兰表达式求值

题目链接:

150. 逆波兰表达式求值 - 力扣(LeetCode)

解题思路:

类似于删除字符串的相邻重复项,当新插入元素为运算符号时,将栈顶两个元素弹出,之后进行相应的计算,之后再把该计算结果压入栈内。最后返回栈顶元素。

代码:

  1. class Solution {
  2. public:
  3. int evalRPN(vector<string>& tokens) {
  4. int len = tokens.size();
  5. stack<int>st;
  6. for(int i=0;i<len;i++){
  7. if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
  8. int b = st.top();
  9. st.pop();
  10. int a = st.top();
  11. st.pop();
  12. if(tokens[i]=="+") st.push(a+b);
  13. else if(tokens[i]=="-") st.push(a-b);
  14. else if(tokens[i]=="/") st.push(a/b);
  15. else if(tokens[i]=="*") st.push(a*b);
  16. }
  17. else{
  18. st.push(stoi(tokens[i]));
  19. }
  20. }
  21. return st.top();
  22. }
  23. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/523859
推荐阅读
相关标签
  

闽ICP备14008679号