美文网首页
2020-06-10(补充记录)基本计算器

2020-06-10(补充记录)基本计算器

作者: 唐moumou | 来源:发表于2020-06-10 23:22 被阅读0次

    题目

    实现一个基本的计算器来计算一个简单的字符串表达式的值。

    字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。

    示例 1:

    输入: "1 + 1"
    输出: 2

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/basic-calculator

    思路:

    首先只给了一个string类型的s,我们要将其中的运算符和数字分开,这里使用一个数字栈和符号栈来存储,
    然后就是对数字进行处理,因为是字符串类型,如果是123的话,每次读取的只有一位,所以

    if (s[i] >= '0'&&s[i] <= '9')
                    {
                        n = n * 10 + s[i] - '0';
                    }
    

    然后就是对符号的操作,如果是‘( ’ 那么肯定要算括号里的内容,紧接着就是数字操作,如果是‘ )’,那么就是括号完,可以直接计算括号里的结果了,所以就接计算,如果是‘+’ 或者‘-’说明前后两数可加减得结果,所以符号进栈,等待加减操作

    可以看出符号操作和数字操作常常在交替进行,所以可以用状态转移的方法来运转整个程序
    定义一个flag 来表示什么时候适合计算
    对于计算的函数,就是当数字栈元素大于2时将栈顶两个元素pop出来,根据符号栈栈顶元素进行计算,然后返回结果到数字栈顶,然后pop出操作的符号。

    class Solution {
    public:
        int calculate(string s) {
            static const int BEGIN = 0;
            static const int NUM_STATE = 1;
            static const int OP_STATE = 2;
            std::stack<int> num;
            std::stack<char> op;
            unsigned n = 0;
            int STATE = 0;
            int flag = 0;
            for (int i = 0; i < s.length();i++)
            {
                if (s[i] == ' ')
                {
                    continue;
                }
                switch (STATE)
                {
                case BEGIN:
                    if (s[i] >= '0'&&s[i] <= '9')
                    {
                        STATE = NUM_STATE;
                    }
                    else
                    {
                        STATE = OP_STATE;
                    }
                    i--;
                    break;
                case NUM_STATE:
                    if (s[i] >= '0'&&s[i] <= '9')
                    {
                        n = n * 10 + s[i] - '0';
                    }
                    else
                    {
                        num.push(n);
                        if (flag == 1)
                        {
                            compute(num, op);
                        }
                        n = 0;
                        i--;
                        STATE = OP_STATE;
                    }
                    break;
                case OP_STATE:
                    if (s[i] == '+' || s[i] == '-')
                    {
                        op.push(s[i]);
                        flag = 1;
                    }
                    else if (s[i] == '(')
                    {
                        STATE = NUM_STATE;
                        flag = 0;
                    }
                    else if (s[i] == ')')
                    {
                        compute(num, op);
                    }
                    else if (s[i] >= '0'&&s[i] <= '9')
                    {
                        STATE = NUM_STATE;
                        i--;
                    }
                        break;
                }
            }
            if (n != 0){
                num.push(n);
                compute(num, op);
            }
            if (n == 0 && num.empty())
            {
                return 0;
            }
            return num.top();
        }
        void compute(std::stack<int>&num_stack, std::stack<char>&op_stack)
        {
            if (num_stack.size() < 2)
            {
                return;
            }
            int num1 = num_stack.top();
            num_stack.pop();
            int num2 = num_stack.top();
            num_stack.pop();
            if (op_stack.top() == '+')
            {
                 num_stack.push(num2 + num1);
            }
            else if (op_stack.top() == '-')
            {
                 num_stack.push(num2 - num1);
            }
            op_stack.pop();
        }
    };
    

    相关文章

      网友评论

          本文标题:2020-06-10(补充记录)基本计算器

          本文链接:https://www.haomeiwen.com/subject/xydytktx.html