简单计算器(九度教程第 27 题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37053885/article/details/88184796

简单计算器(九度教程第 27 题)

时间限制:1 秒 内存限制:32 兆 特殊判题:否

1.题目描述:

题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过 200 个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有 0 时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出 1 行,即该表达式的值,精确到小数点后 2 位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
来源:
2006 年浙江大学计算机及软件工程研究生机试真题

2.基本思路

基本的四则远算,没有包括括号。首先定义优先级从低到高依次为"+ - * / # ",注意其中‘#’用于涵盖整个表达式,便于对表达式的结束条件进行判断。
采用两个栈来实现,一个栈用来存储数值一个栈用来存储运算符。从左到右扫描一遍字符串,遇到数字则压入栈中,遇到空格继续扫描下一个字符,遇到运算符则进行讨论。

  • ①如果当前的运算符比栈顶元素运算符的优先级高,则将该运算符压入栈中
  • ②如果当前的运算符优先级小于等于栈顶元素运算符,则取运算符的栈顶元素,同时取数值栈的栈顶的两个数字进行运算,然后将计算结果再次压入数值栈中。

3.代码实现

#include <iostream>
#include <string.h>
#include <map>
#include <stack>
#define N 202
using namespace std;

map<char,int> prior;

char expression[N];
stack<char> op;
stack<double> number;
int main()
{
    int num=0;
    int c=1;//进位
    bool isNum=false;
    prior['#']=1;prior['+']=2;prior['-']=3;prior['*']=4;prior['/']=5;
    while(gets(expression)){

        int len = strlen(expression);
        if(len==1&&expression[0]=='0')break;
        expression[len]='#';
        while(!op.empty())op.pop();//清空
        while(!number.empty())number.pop();
        op.push('#');
        for(int i=0;i<=len;i++){
            if('0'<=expression[i]&&expression[i]<='9'){

                num=num*c+expression[i]-'0';
                c*=10;
                isNum=true;
                continue;
            }
            if(isNum==true)
                number.push(num);
            if(prior[expression[i]]!=0){

                if(prior[expression[i]]>prior[op.top()]){
                    op.push(expression[i]);
                }
                else{
//                    printf("prior[expression[i]]=%d,prior[op.top()]=%d\n",prior[expression[i]],prior[op.top()]);
                    while(prior[expression[i]]<=prior[op.top()]){
                        if(op.top()=='#')break;
                        double a = number.top();number.pop();
                        double b = number.top();number.pop();
                        char _operator = op.top();op.pop();
                        if(_operator=='+'){
                            number.push(b+a);
                        }
                        else if(_operator=='-')
                            number.push(b-a);
                        else if(_operator=='*')
                            number.push((double)a*b);
                        else
                            number.push(b/a);
                    }
                    op.push(expression[i]);

                }
            }
            num=0;
            c=1;
            isNum=false;
        }
        printf("%.2f\n",number.top());
    }
    return 0;
}
/*
4 + 2 * 5 - 7 / 11
4 * 8 / 4 / 7 + 10 - 3 / 1 / 4 * 1 * 3
*/

(PS:该题的代码在牛客网上面已经通过测试了,但在hdu上WA,现在还不知道是不是上面特殊情况没考虑到)

猜你喜欢

转载自blog.csdn.net/qq_37053885/article/details/88184796