DAY11(20.有效括号,1047.删除字符串中的所有相邻重复项,150.逆波兰表达式求值)

20.有效括号

题目链接:20. 有效的括号 - 力扣(LeetCode)

题目描述:

解题思路:使用栈来解决。最原始的思路就是遍历字符串,然后将遍历到的字符存入栈内。如果发现有相匹配的括号的话,则弹出这一对括号,即完成“消消乐”。但是从代码实现上,会比较繁琐,且容易出错。现对不匹配的情况进行总结。

有三种情况会出现return false的情况。

1、左括号多了;

2、右括号多了;

3、左右括号不匹配。

优化思路:当遍历到左括号的时候,则往栈内存入对应的右括号。当遍历到右括号的时候,则将这个括号与栈顶的元素相比较,若相等则弹出栈顶元素,继续遍历比较,若不相等则return false(情况2),当还没有完成整个字符串遍历的时候,栈内已经为空,则说明右括号多了(情况3);当遍历完字符串之后发现栈内还有多余元素没有弹出,则说明左括号多了(情况1)。最后没有出现这三种情况中的任何一种则说明括号完全匹配。

代码实现:

class Solution {
public:
    bool isValid(string s) {
        if(s.size() % 2 != 0) return false;//若字符串长度不为2则直接报错
        stack<char>stack1;
        for(int i =0;i < s.size();i++){
            if(s[i] == '(') stack1.push(')');
            else if(s[i] == '[') stack1.push(']');
            else if(s[i] =='{')  stack1.push('}');
            else if( stack1.empty() || stack1.top() != s[i]) return false;//情况2,3
            else stack1.pop();
        }
        if(!stack1.empty()){//情况1
            return false;
        }
        return true;
        
    }
};

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

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

题目描述:

解题思路:可以使用栈解题。当栈为空或则栈顶元素不等于遍历到的元素的时候,则往栈内压入现在遍历到的元素,若遍历到的元素等于栈顶元素的时候,则将栈顶元素弹出,继续往后遍历。最后依次让栈内元素弹出,并保存,然后进行反转则能够获取到相应结果。

代码实现:

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char>stack1;
        for(int i =0; i<s.size();i++){
            if(stack1.empty() || s[i] != stack1.top()){
                stack1.push(s[i]);
            }
            else{
                stack1.pop();
            }

        }
        string result = "";
        while(!stack1.empty()){
            result += stack1.top();
            stack1.pop();
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

150.逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

题目描述:

解题思路:这题其实和上一题思路一样,只不过是将弹出元素的操作换成了元素之间的运算,然后运算完成之后需要把结果重新压入栈内。

代码实现:

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(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } else {
                st.push(stoll(tokens[i]));
            }
        }

        int result = st.top();
        st.pop(); 
        return result;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值