zoukankan      html  css  js  c++  java
  • 【LeetCode】基本计算器II

    【问题】实现一个基本的计算器来计算一个简单的字符串表达式的值。
    字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。整数除法仅保留整数部分。

    输入: "3+2*2"
    输出: 7
    示例 2:
    输入: " 3/2 "
    输出: 1

    【思路】

    总体思路来说,我们遍历字符串的每个字符,注意:加减乘除以及空格的ASCII码 < '0'。如果这个字符为数字字符,需要将两个非数字字符之间的不包含空格的字符串变换成数值!
    表达式:num = num * 10 - '0' + s[i];

    对于非数字字符来说,有三种情况:

    • '+': 将这个字符后面的数压入堆栈nums中

    • '-': 将这个字符后面的数取反后压入堆栈nums中

    • '*' 或 '/': nums.top()为这个符号前面的数,而num为这个符号后面的数,根据符号计算这两个数的值后,再压入堆栈

    这样一来,表达式的结果就是最后堆栈内所有数值的和,有一个问题:表达式的第一个值是怎么获取的呢?因为程序中总是将非数字符号后面的值压入堆栈中,但第一个值的前面有符号么?当然有,因为sign的初始化为'+'.

    class Solution {
    public:
        int calculate(string s) {
            int res = 0, num = 0;
            char sign = '+';
            stack<int> nums;
            for(int i = 0; i < s.size(); i++){
                if(s[i] >= '0'){
                    num = num * 10 - '0' + s[i];   //要先做减法,否则int型会溢出
                }
                if((s[i] < '0' && s[i] != ' ') || i == s.size() -1){
                    if(sign == '+'){
                        nums.push(num);
                    }
                    else if(sign == '-'){
                        nums.push(-num);
                    }
                    else if(sign == '*' || sign == '/'){
                        int tmp = sign == '*' ? nums.top() * num : nums.top() / num;
                        nums.pop();
                        nums.push(tmp);
                    }
                    sign = s[i];
                    num = 0;
                }
            }
            while(!nums.empty()){
                res += nums.top();
                nums.pop();
            }
            return res;
        }
    };
  • 相关阅读:
    Windows消息循环
    python 如何获得网卡的Ip地址
    curl 如何测量它花了多少时间?
    mininet 如何创建有不同带宽的链路
    Emacs学习笔记:多窗口操作
    RYU 如何扔掉一个符合要求的数据包
    RYU OFPMatch 的使用方法
    __attribute__如何使用的记录
    make file 和 GCC标志学习
    mininet and ovs 总结
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11735037.html
Copyright © 2011-2022 走看看