【算法】【栈】栈相关题目

字符串解码

题目链接:https://leetcode-cn.com/problems/decode-string/

class Solution {
public:
    string decodeString(string s) {
        //用一个数字栈 保存数字
        //一个string栈 保存str
        //遍历字符串
        //  遇到数字计算 sum
        //  遇到左括号 把数字压栈
        //  遇到字母 ch
        //  遇到右括号  用来追加结果

    
        //实现一个能够使用分配律的计算器
        //3[a2[c]b] -> 3[accb] -> accbaccbaccb
        int n = s.size();
        stack<int> st_num;
        stack<string> st_ch;

        string res = "";
        int num = 0;
        for(int i = 0; i < n; i++)
        {
            char ch = s[i];
            if(ch >= '0' && ch <= '9') num = num * 10 + ch - '0';
            //将[前的数字压入数字栈中,字母字符串压入字符串中
            else if(ch == '[') 
            {
                st_num.push(num);
                num = 0;
                st_ch.push(res);
                res.clear();
            }
            else if((ch >= 'a' && ch <= 'z' ) || (ch >= 'A' && ch <= 'Z' ))
                res += ch;
            //遇到] 操作跟它相匹配的[之间的字符串,使用分配律
            else if(ch == ']')
            {
                int cnt = st_num.top();
                st_num.pop();

                for(int i = 0; i < cnt; i++)
                    st_ch.top() += res;
               
                res = st_ch.top(); //之后若还是字母,就会直接加入到res之后
                cout << res << " ";
                //之后若是左括号,res会被压入字符栈中,作为上一层的运算
                st_ch.pop();
            }
        }
        return res;
    }
};

基本计算器(不带括号)

题目链接:https://leetcode-cn.com/problems/basic-calculator-ii/

class Solution {
public:
    int calculate(string s) {
        int n = s.size();

        stack<long> st_nums;
        
        long sum = 0;
        char op = '+';
        for(int i = 0; i < n; i++)
        {
            char ch = s[i];
            if(ch >= '0') sum = sum * 10 + ch - '0';
            //如果是最后一位数字时,计算上一个符号的结果并入栈
            if((ch < '0' && ch != ' ') || i == n - 1)
            {
                int pre;
                switch(op)
                {
                    //当前符号为加减的时候,下一个元素以正负整数的形式直接入栈
                    case '+':
                        st_nums.push(sum);
                        break;
                    case '-':
                        st_nums.push(-sum);
                        break;
                    //当前符号为乘除的时候,下一个元素与栈顶元素计算结果后入栈顶
                    case '*':
                        pre = st_nums.top();
                        st_nums.pop();
                        st_nums.push(pre * sum);
                        break;
                    case '/':
                        pre = st_nums.top();
                        st_nums.pop();
                        st_nums.push(pre / sum);
                        break;
                }
                op = ch; //更新符号
                sum = 0; //数字清零
            }
        }

        int res = 0;
        //栈不空,栈中的元素相加就是结果
        while(!st_nums.empty())
        {
            res += st_nums.top();
            st_nums.pop();
        }
        return res;
    }
};

基本计算器(带括号)

题目链接:https://leetcode-cn.com/problems/basic-calculator/

class Solution {
public:
    int calculate(string s) {
        stack<char> op;
        stack<int> num;
        for (int i = 0; i < s.size(); i ++ ) {
            char c = s[i];
            if (c == ' ') continue;
            if (c == '+' || c == '-' || c == '(') op.push(c);
            else if (c == ')') {
                op.pop();
                if (op.size() && op.top() != '(') {
                    calc(op, num);
                }
            }
            else {
                int j = i;
                while (j < s.size() && isdigit(s[j])) j ++ ;
                num.push(atoi(s.substr(i, j - i).c_str()));
                i = j - 1;
                if (op.size() && op.top() != '(') {
                    calc(op, num);
                }
            }
        }
        return num.top();
    }
    void calc(stack<char> &op, stack<int> &num) {
        int y = num.top();
        num.pop();
        int x = num.top();
        num.pop();
        if (op.top() == '+') num.push(x + y);
        else num.push(x - y);
        op.pop();
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章