zoukankan      html  css  js  c++  java
  • 227.Basic Calculator II

    题目描述

    Implement a basic calculator to evaluate a simple expression string.

    The expression string contains only non-negative integers, +, -, *, / operators and empty spaces ``. The integer division should truncate toward zero.

    Example 1:

    Input: "3+2*2"
    Output: 7

    Example 2:

    Input: " 3/2 "
    Output: 1

    Example 3:

    Input: " 3+5 / 2 "
    Output: 5

    Note:

    • You may assume that the given expression is always valid.

    • Do not use the eval built-in library function.

    难度系数

    Medium

    解法一:先计算乘除法,同时将结果保存在双端队列中,而后再计算加减法

    class Solution {
    public:
        //总体思想,先计算乘除法,而后再计算加减法
        int calculate(string s) {
            deque<long long>sta_int;
            deque<char> sta_char;
            int i=0;
            long long num=0;
            while(i<s.size()){
                //将连续的数字转化为int,压入栈中,同时
                if(isdigit(s[i])){
                    while (isdigit(s[i])){
                        num=num*10+s[i]-'0';
                        i++;
                    }
                    sta_int.push_back(num);
                    num=0;
                }
                //去除字符串中的空格
                while (s[i]==' ')
                    i++;
                //如果加减号则将符号压入符号栈
                if(s[i]=='+'||s[i]=='-'){
                    sta_char.push_back(s[i]);
                    i++;
                }
                //如果是乘除法,则直接计算结果,将结果压入数字栈中
                if(s[i]=='/'||s[i]=='*'){
                    int temp=0;
                    char cal=s[i];
                    i++;
                    //除去符号左右的空格
                    while (s[i]==' ')
                        i++;
                    //获取符号的后一个数字
                    while (isdigit(s[i])){
                        temp=temp*10+s[i]-'0';
                        i++;
                    }
                    //获取符号前一个数字
                    num=sta_int.back();
                    sta_int.pop_back();
                    //运算
                    num=calc(cal,num,temp);
                    sta_int.push_back(num);//结果压栈
                    num=0;
                }
            }
            //正向计算加减法,如果负向计算,1-1+1,这个通不过
            int a=sta_int.front();
            sta_int.pop_front();
            if(sta_char.empty())//表示只有乘法和除法
                return a;
            else{
                //计算加减法
                while (!sta_char.empty()){
                    int b=sta_int.front();
                    sta_int.pop_front();
                    char cal=sta_char.front();
                    sta_char.pop_front();
                    a=calc(cal,a,b);
                }
            }
            return a;
        }
        //四则运算
        int calc(char cal,int a,int b){
            if(cal=='+')
                return a+b;
            else if(cal=='-')
                return a-b;
            else if(cal=='*')
                return a*b;
            else
                return a/b;
        }
    };

    解法二:利用istringstream将数字和字符隔开

    class Solution {
    public:
        int calculate(string s) {
            //最后的+号是把加减的结果和乘除的结果加起来
            istringstream in(s+'+');
            long long res = 0, val;
            char op;
    ​
            in >> val;
            while (in >> op) {
                if (op == '+' || op == '-') {
                    res += val;//计算符号的前一个值
                    in >> val;
                    val *= (op == '+') ? 1 : -1;//统一符号的后一个值
                } else {
                    int currVal;
                    in >> currVal;
                    if (op == '*') {//计算当前符号左右两侧的值
                        val *= currVal;
                    } else {
                        val /= currVal;
                    }
                }
            }
            return res;
        }
    };

    解法三:将数字和运算符分别保存在两个队列中,而后再计算最终的值

    class Solution {
    public:
        int ptr = 0;
        int calculate(string s) {
            int num = 0;
            queue<int> num_que;//保存运算的数字
            queue<char> char_que;//保存运算符
            while (ptr < s.size()) {
                char ch = s[ptr++];
                if (ch == ' ') continue;
                if (ch >= '0' && ch <= '9') num = num*10 + (ch - '0');
                else {//运算符号
                   num_que.push(num);
                   char_que.push(ch);
                   num=0;
                }
            }
            num_que.push(num);//将最后一个数字push到队列中
            num=num_que.front();num_que.pop();
            char_que.push('+');
            int sum=0;
            while (!char_que.empty()){
                char ch=char_que.front();char_que.pop();
                if(ch=='+'||ch=='-'){
                    sum+=num;
                    num=num_que.front();num_que.pop();
                    num *= (ch == '+') ? 1 : -1;
                }else{
                    int curVal=num_que.front();num_que.pop();
                    if(ch=='*')num*=curVal;
                    if(ch=='/')num/=curVal;
                }
            }
            return sum;
        }
    };

     

  • 相关阅读:
    iReaper
    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告(turn)
    用C#写ExtJS代码的开源工具extsharp
    如何你是公司的HR,去招聘asp.net程序员,你会对前来面试的人问什么问题。
    ExtJS 3.0 Designer Preview (官方的IDE可视化工具)
    Asp.net ajax、Anthem.net、Ajax pro三大ajax框架那一种使用比较方便?易于配置?
    C#和ASP.net程序员招聘技能要求
    序列化上面创建的Person对象,使其成为一个JSON字符串
    10大加速Ajax开发的框架
    android 解决wifi断线不稳定的问题终极办法
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/12770882.html
Copyright © 2011-2022 走看看