美文网首页
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(补充记录)基本计算器

    题目 实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式可以包含左括号 ( ,右括号 ),加号 ...

  • 224. Basic Calculator

    题意:基本计算器

  • 闭包(let和立即执行函数解决,有的要求手写闭包改写哪一个呢)

    补充: 实现一个计算器API: Calculator().input(5).add(5).minus(3) = ...

  • 力扣算法 - 基本计算器

    基本计算器 题目 Java实现

  • 基本计算器

    更新5:改善ui界面,暂时就这样一个版本吧.注意点: 减号和负号没集合到一起,负号只能在数字写完后添加,数字未输完...

  • 基本计算器

    题目描述:实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式可以包含左括号 ( ,右括号 ),加号...

  • 线上听课,向同事学习

    2020-06-10周三 前段时间,学校进行了聘期考核,要提交相关材料,期中一项是听课记录表。在准备听课记录表时,...

  • 补充记录📝

    装家具 在阳台上留下kiss 收到第二束花 我们的周末 百合开了 这个宝贝在教育我 西瓜盘 此处省略2张不可描述的...

  • 补充记录

    昨天算开始,预热下。不能第二天就“夭折”!开个贴吧。 输入: 早:起太晚,没吃! 中:肉炒洋葱、杭椒鸡蛋、生菜肉片...

  • 【精通iOS开发】 (第7版)

    都比较基础,顺便补充一下UIKit,UIFoundation中的学习记录,而且版本的问题,基本都是storyoar...

网友评论

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

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