代码随想录算法训练营第十一天:20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

20. 有效的括号

括号匹配三种错误情况:左右括号类型不匹配;右括号比左括号多,右括号会遇到空栈;左括号比右括号多,多的左括号会留在栈内。

class Solution {
public:
    stack st;
    bool isValid(string s) {
        for(int i=0;i

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

遍历字符串,如果栈为空,就把第一个s[0]入栈,否则就跟栈顶元素作比较,如果一样就出栈,如果不一样就把这个元素入栈。

150. 逆波兰表达式求值

用后缀表达式求结果,之前知道用一个符号栈加一个操作数栈。

string转数字用一个函数:stoll。记住类型转化不要自己写函数了。

一开始我用if判断数字,还忘记负数的第一个字符是-,加了之后

if((tokens[i][0]>='0'&&tokens[i][0]<='9')||(tokens[i][0]=='-'))
            {
                ss.push(stoll(tokens[i]));
            }
            else//符号
            {}

减法就会被误当做负数,所以还是在if里面判断+-*/字符串更方便。

if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
            {
                if(ss.size()<2)return ss.top();
                long long c1=ss.top();
                ss.pop();
                long long c2=ss.top();
                ss.pop();
                char ch=tokens[i][0];
                switch(ch)
                {
                    case '*':
                        ss.push(c1*c2);
                        break;
                    case '+':
                        ss.push(c1+c2);
                        break;
                    case '-':
                        ss.push(c2-c1);
                        break;
                    case '/':
                        ss.push((long long)(c2/c1));
                        break;
                    default:
                        break;
                }
                
            }
            else//符号
            {
                ss.push(stoll(tokens[i]));
            }

注意数得用long long类型。

还有除法和减法的被减数和被除数得是次栈顶不是栈顶!

虽然简单,但是自己要注意的点还挺多的

你可能感兴趣的:(算法)