【算法训练记录——Day11】

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

20.有效的括号

在这里插入图片描述
思路:没有想到用栈,刚开始以为“({)}”这种也行,直接一次循环,后来发现不行,那就只能重新想办法,看题解用栈

	bool isValid(string s) {
		int len = s.size();
		if(len % 2 != 0) return false;
    	stack<int> st;
    	for(char c : s) {
			if(c == '(') st.push(')');
			else if (c == '[') st.push(']');
			else if (c == '{') st.push('}');
			else if (!st.empty() && st.top() == c) st.pop();
			else return false;
		}
		return st.empty();
    }

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

在这里插入图片描述
思路:有了上一题的经验,还是明白应该用栈的,当前元素和栈顶相同出栈,不同直接入栈。最后返回栈。

	string removeDuplicates(string s) {
        stack<char> st;
        for(char c : s) {
            if (!st.empty() && c == st.top())
                st.pop();
            else st.push(c);
        }
        string res = "";
        while(!st.empty()) {
            res += st.top();
            st.pop();
        }
        reverse(res.begin(), res.end());
        return res;
    }
时间复杂度: O(n)
空间复杂度: O(n)

方法二:栈也是只用最后一位,但需要反转整个字符串。用字符串替换栈也可以做到。

	string removeDuplicates(string s) {
        string res = "";
        for(char c : s) {
            if (!res.empty() && c == res.back())
                res.pop_back();
            else res.push_back(c);
        }
        return res;
    }
时间复杂度: O(n)
空间复杂度: O(1),返回值不计空间复杂度

150.逆波兰表达式求值

在这里插入图片描述
思路:逆波兰式是后缀表达式,使用栈保存数字,遇到操作符弹出栈顶两个元素,运算后再入栈。

int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        for(string s : tokens) {
            if(s == "+" || s == "-" ||
               s == "*" || s == "/") {
                long long num2 = st.top();
                st.pop();
                long long num1 = st.top();
                st.pop();
                long long num = 0;
                if(s[0] == '+') num = num1 + num2;
                if(s[0] == '-') num = num1 - num2;
                if(s[0] == '*') num = num1 * num2;
                if(s[0] == '/') num = num1 / num2;
                st.push(num);
               } else 
                st.push(stoi(s));
        }
        return st.top();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值