题解 | #计算表达式#

计算表达式

http://www.nowcoder.com/practice/7b18aa6b7cc14f8eaae6b8acdebf890b

使用两个辅助栈,一个保存运算数字,一个保存运算符 需要注意的是栈元素使用float保存,输出的时候只输出整数部分

#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <cctype>
#include <iostream>

using namespace std;
string str;
stack<float> nums;
stack<char> ops;

int getNum(int left, int &i_new){
    int right = left;
    int res = 0, base = 1;
    while(isdigit(str[right]))
        right++;

    i_new = right;
    right--;

    while(right >= left){
        res += base * (str[right] - '0');
        base *= 10;
        right--;
    }
    
    // printf("Get Num: %d \n", res);
    return res;
    
}

int priority(char ch){
    if(ch == '#')
        return 0;
    if(ch == '$')
        return 1;
    if(ch == '+' || ch == '-')
        return 2;
    else
        return 3;
    
}

void calculate(char op, char top){
    float right, left;
    float sum=0;
    
    while(priority(top) >= priority(op)){
        right = nums.top();
        nums.pop();
        left = nums.top();
        nums.pop();
        
        if(top == '+'){
            sum = left + right;
        }else if(top == '-'){
            sum = left - right;
        }else if(top == '*'){
            sum = (1.0)*left * right;
        }else{
            sum = (1.0)*left/right;
        }
        nums.push(sum);
        ops.pop();
        top = ops.top();
    }
    ops.push(op);
}

int main(void){
    

    char op, top;
    while(getline(cin, str)){
        while (!nums.empty())
        {
            nums.pop();
        }
        while(!ops.empty()){
            ops.pop();
        }
        
        int i=0, num, left, right;
        ops.push('#');
        str = str + "$";
        while(i<str.size()){
            if(isdigit(str[i])){
                num = getNum(i, i);
                nums.push(num);
            }else{
                op = str[i++];
                top = ops.top();
                
                if(priority(op) > priority(top)){
                    // 如果当前运算符比栈顶运算符高,入栈
                    ops.push(op);
                }else{
                    //运算,直到栈顶低于当前运算符
                    calculate(op, top);
                }
            }
        }
        printf("%d\n", (int)nums.top());
    }
    
    
    return 0;
}
全部评论

相关推荐

球球offer到我邮箱吧:同测评了一个月 亏我笔试还AK了
投递米哈游等公司8个岗位 > 米哈游求职进展汇总
点赞 评论 收藏
分享
03-07 13:49
门头沟学院 Java
逆流河上万仙退:可能是发的钱太少了 怕你过来实习还要自己贴钱 意向就不高 省的浪费大家时间 可能你通过了也不会去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务