简单计算器(栈和队列的应用)

简单计算器 codeup1918 

918: 简单计算器

时间限制: 1 Sec  内存限制: 32 MB
提交: 2063  解决: 846
[提交][状态][讨论版][命题人:外部导入]

题目描述

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入

30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0

样例输出

12178.21

思路:
题目给出的计算式是中缀表达式,求解的步骤是,第一步将中缀表达式转换为后缀表达式,第二步计算后缀表达式的结果
利用栈存储操作符,队列存储后缀表达式

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <stack>
  5 #include <queue>
  6 #include <map>
  7 
  8 using namespace std ;
  9 
 10 struct node{
 11     double num ;
 12     char op ;
 13     bool flag ;//op or num
 14 };
 15 
 16 stack<node> stk ;
 17 queue<node> que ;
 18 map<char,int> mp ;
 19 string str ;
 20 
 21 //30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92 
 22 
 23 void transform(){//将中缀表达式转换为后缀表达式 
 24     int la = str.size() ;
 25     for(int i=0;i<la;i++){
 26         if(str[i]>='0' && str[i]<='9'){
 27             node tmp ;
 28             tmp.num = str[i++] - '0' ;
 29             tmp.flag = true ;
 30             while(str[i]>='0' && str[i] <= '9' && i < la){
 31                 tmp.num = tmp.num * 10 + str[i] - '0' ;
 32                 i++ ;
 33             }
 34             i--;
 35             que.push(tmp) ;
 36         }else{
 37             node tmp ;
 38             tmp.op = str[i] ;
 39             tmp.flag = false ;
 40             while(!stk.empty() && mp[stk.top().op] >= mp[tmp.op]){
 41                 auto ele = stk.top() ;
 42                 stk.pop() ;
 43                 que.push(ele) ;
 44             }
 45             stk.push(tmp) ;
 46         }
 47     }
 48     while(!stk.empty()){
 49         auto ele = stk.top() ;
 50         stk.pop() ;
 51         que.push(ele) ;
 52     }
 53 }
 54 
 55 double calc(){//计算结果 
 56     while(!que.empty()){
 57         auto ele = que.front() ;
 58         que.pop() ;
 59         if(ele.flag){
 60             stk.push(ele) ;
 61         }else{
 62             node tmp ;
 63             tmp.flag = true ;
 64             double num1 = stk.top().num ;
 65             stk.pop() ;
 66             double num2 = stk.top().num ;
 67             stk.pop() ;
 68             if(ele.op == '+'){
 69                 tmp.num = num2 + num1 ;
 70             }else if(ele.op == '-'){
 71                 tmp.num = num2 - num1 ;
 72             }else if(ele.op == '*'){
 73                 tmp.num = num2 * num1 ;
 74             }else{
 75                 tmp.num = num2 / num1 ;
 76             }
 77             stk.push(tmp) ;
 78         } 
 79     }
 80     return stk.top().num ;
 81 }
 82 
 83 int main(){
 84     mp['+'] = mp['-'] = 1 ;
 85     mp['*'] = mp['/'] = 2 ;
 86     while(getline(cin,str),str != "0"){
 87         for(string::iterator it=str.begin();it!=str.end();it++){
 88             if(*it == ' '){
 89                 str.erase(it) ;
 90             }
 91         }
 92         transform() ;
 93         printf("%.2lf\n",calc()) ;
 94         while(!stk.empty()){
 95             stk.pop() ;
 96         }
 97     }
 98     
 99     return 0 ;
100 }

 

...

posted @ 2019-12-18 20:24  gulangyuzzz  阅读(495)  评论(0编辑  收藏  举报