day 11 第五章 栈与队列

20. 有效的括号

尝试了一下,不会搞,看一下视频的方法。

先分析几种括号不匹配的情况。1.左括号多余不匹配。2.括号没有多余但是括号类型不匹配。3.右括号多余不匹配。

先遍历字符串,如果是左括号就把对应的右括号入栈,如果是右括号则出栈。

class Solution {
public:
    bool isValid(string s) {
        stack<int> st;
        if(s.size() % 2 != 0) return false; //字符串长度为奇数一定false
        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]) {//若出栈的元素和s[i]不等则为第二种情况,若为空则为第三种情况右括号多余
                                        //细节!这里或条件如果把st.top() != s[i]放在前面,当栈为空时会出现报错
                return false;
            }else {             //如果不是这些情况那么出栈
                st.pop();
            }
        }
        if(!st.empty()) {       //遍历完成后如果栈不为空则为第一种情况左括号多余
            return false;
        }else {                 //如果栈为空则说明匹配成功
            return true;
        }
    }
};

注意pop()是无参。



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

搞一个栈,遍历字符串。第一次遍历到该元素则入栈,第二次遍历到该元素则出栈。直至遍历完之后将所有元素出,然后再反转字符串。

class Solution {
public:

    string removeDuplicates(string s) {
        stack<char> st;
        for(int i = 0;i < s.size();i++){
            if(st.empty() || st.top() != s[i]) {    //如果栈为空或者栈顶元素和S遍历到的元素不相等,则入栈
                st.push(s[i]);
            }else {
                st.pop();
            }
        }
        string result = {};     //新建一个空字符串
        while(!st.empty()) {    //当栈不为空时把元素出栈并拼接到字符串后
            result += st.top();
            st.pop();     
        }
        //注意不能这样写return reverse(result,result.size()); reverse没有返回值
        reverse(result.begin(),result.end());
        return result;
    }
};

没问题!很好!

最后反转字符串遇到的问题:字符串反转三种方式:1.使用string.h中的strrev函数,strrev(s),无返回值。2.使用algorithm中的reverse函数,reverse(s.begin(),s.end()),无返回值。3.自己编写函数。

150. 逆波兰表达式求值

搞一个栈,开始遍历数组tokens,如果是数字则入栈,如果是符号则将符号前两个数字出栈进行运算后得到一个数字再进栈,遍历完成时则输出最后的结果。

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<char> st;         //搞一个栈
        int res = 0;                //搞一个res计算两个数
        for(int i = 0;i < tokens.size();i++){
            if(tokens[i] >= -200 && tokens[i] <= 200){
                st.push(tokens[i]);
            }else {
                st.pop();
                st.pop();
                res = int(tokens[i - 1]) tokens[i] int(tokens[i - 2]);
                st.push(res);
            }
        }
        return st.top();
    }
};

感觉思路没错,代码有问题。

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();
        return result;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值