zoukankan      html  css  js  c++  java
  • codeup- 简单计算器

    Problem A: 简单计算器

    Time Limit: 1 Sec  Memory Limit: 32 MB
    Submit: 2115  Solved: 867
    [Submit][Status][Web Board][Creator:Imported]

    Description

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

    Input

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

    Output

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

    Sample Input

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

    Sample Output

    12178.21


    具体代码是:

     1 #include <iostream> 
     2 #include <string>
     3 #include <stack>
     4 using namespace std;
     5 
     6 double comp(double a, double b, char c){ // 进行具体的操作
     7     double temp;
     8     switch(c){
     9         case '-':
    10             temp = a - b;
    11             break;
    12         case '+':
    13             temp = a + b;
    14             break;
    15         case '/':
    16             temp = a / b;
    17             break;
    18         case '*':
    19             temp = a * b;
    20             break;
    21     }
    22     return temp;
    23 }
    24 
    25 bool Judge(char c1, char c2){ //比较符号栈栈顶元素与将要入栈的符号之间的优先级
    26     bool flag = true;
    27     if(c1=='-'&&c2=='/' || c1=='-'&& c2=='*'){
    28         flag = false;
    29     }else if(c1=='+'&&c2=='/' || c1=='+'&& c2=='*'){
    30         flag = false;
    31     }
    32     return flag;
    33 }
    34 
    35 int main(){
    36     string s;
    37     stack<char> sc;
    38     stack<double> sb; 
    39     while(getline(cin, s)){
    40         if(s.size()==1 && s=="0"){ //仅输入0时,退出程序
    41             break;
    42         }
    43         double temp, a, b;
    44         int i=0, len = s.size();
    45         char c;
    46         do{
    47             temp = 0;
    48             for( ; i<len; i++){ //操作数入栈
    49                 if(s[i]==' '){
    50                     sb.push(temp);  
    51                     break;
    52                 }else{
    53                     temp = temp * 10 + s[i] - '0';
    54                 }
    55                 if(i==len-1){ //注意最后一个操作后无空格,需要特殊处理
    56                     sb.push(temp);
    57                 }
    58             }
    59             if(i != len){
    60                 i++; //跳过符号前的空格
    61                 while(!sc.empty()){ //只要符号栈内有优先级高的操作符,均先出栈处理
    62                     c = sc.top();
    63                     if(Judge(c, s[i])){ 
    64                         //符号栈顶元素需要出栈 
    65                         b = sb.top(); //第二个操作数 
    66                         sb.pop();
    67                         a = sb.top(); //第一个操作数
    68                         sb.pop();
    69                         temp = comp(a, b, c);
    70                         sb.push(temp);
    71                         sc.pop();
    72                     }else{
    73                         break;
    74                     }    
    75                 }
    76                 sc.push(s[i]);//将当前操作符入栈
    77                 i = i + 2; //跳过符号后的空格
    78             }else{
    79                 b = sb.top(); //第二个操作数 
    80                 sb.pop();
    81                 a = sb.top(); //第一个操作数
    82                 sb.pop();
    83                 temp = comp(a, b, sc.top());
    84                 if(!sc.empty()){ //一定不要忘记,符号栈不空时,操作后的操作数入栈,保证最后一次操作还剩两个操作符
    85                     sb.push(temp);
    86                 }
    87                 sc.pop();
    88             }
    89         }while(!sc.empty());
    90         printf("%.2f
    ", temp);
    91     }
    92     return 0;
    93 }

    注意:

    1、对最后一个操作数的处理,一定别忘记将其入栈。

    2、操作符优先级的比较逻辑,分清四种情况

    3、当所有元素已经入栈完,此时符号栈不空,操作数栈的元素一定是>=2个的。保证进行最后一次操作时,操作数栈的元素只有2个,且操作结果无需再次入栈。

  • 相关阅读:
    Indy10 系列(一)——获取最新的Indy源码
    Oracle9i中关于select into的执行过程 (转)
    Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结(转)
    手动创建Oracle 11g数据库(转载)
    Indy10 系列(四)——编译Indy源码
    Indy10 系列(二)——获取最新的Indy源码
    Delphi 2010手动安装indy10.5.7
    Indy10 系列(三)——获取最新的Indy源码
    Indy10 系列(五)——安装Indy控件,重新编译Lazarus
    Unix文化RTFM
  • 原文地址:https://www.cnblogs.com/heyour/p/12162395.html
Copyright © 2011-2022 走看看