<题目链接>

题目大意:

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

Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 
Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 
Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

解题分析:

表达式求值简单题,只涉及四则运算,我们只需要借助栈,将中缀表达式转化为后缀表达式进行计算即可。

 #include <cstdio>
 #include <cstring>
 #include <stack>
 #include <algorithm>
 using namespace std;

 ];
 int change(char c){   //将每个运算符都转化为数字,方便比较和区分
     ;
     ;
     ;
     ;
     ;
 }
 int cmp(int a,int b){    //比较运算符的优先级
     ||a==)a=;
     ;
     ||b==)b=;
     ;
     ;
     ;
 }
 void solve(){
     stack<double>a;   //后缀数字栈
     stack<int>b;   //运算符栈
     int len=strlen(str);
     //将中缀表达式借助栈转化为后缀表达式
     ;i<len;i++){
         if(str[i]==' ')continue;   //遇到空格,跳过
         '){   //将连续的数字字符转化为数字
             ;
             '){
                 cal=cal*+str[i]-';
                 i++;
             }
             a.push(cal);
         }
         if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){
             int temp=change(str[i]);
             if(b.empty())b.push(temp);  //如果开始栈空,则无需比较
             else{
                 int res=b.top();
                 while(cmp(res,temp)){  //运算符栈里的优先级大于当前的,就先运算栈顶优先级大的,最后再将当前操作符(temp)压入栈内
                     double a1=a.top();a.pop();  //弹出2个操作数
                     double b1=a.top();a.pop();
                     int c=b.top();b.pop();  //弹出运算符栈里的运算符
                     switch(c){
                         :
                             a.push(a1+b1);
                             break;
                         :
                             a.push(b1-a1);   //这里为什么是b1-a1?
                             break;
                         :
                             a.push(a1*b1);
                             break;
                         :
                             a.push(b1/a1);
                             break;
                     }
                     if(b.empty())break;   //如果栈空,就终止
                     else res=b.top();   //否则继续比较运算符栈顶和当前运算符的优先级
                 }
                 b.push(temp);    //将这个运算符压入栈内
             }
         }
     }
     while(!b.empty()){   //当栈b内仍然有运算符时,说明运算还未结束
         double a1=a.top();a.pop();
         double b1=a.top();a.pop();
         int c=b.top();b.pop();
         switch(c){
             :
                 a.push(a1+b1);
                 break;
             :
                 a.push(b1-a1);
                 break;
             :
                 a.push(a1*b1);
                 break;
             :
                 a.push(b1/a1);
                 break;
         }
     }
     printf("%.2lf\n",a.top());
 }

 int main(){
     ")){
         solve();
     }
     ;
 }

2018-10-04

hdu 1237 简单计算器 (表达式求值)【stack】的更多相关文章

  1. OpenJudge计算概论-简单算术表达式求值

    /*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...

  2. hdu 1237 简单计算器

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...

  3. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. Openjudge-NOI题库-简单算术表达式求值

    题目描述 Description 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有 ...

  5. Openjudge-计算概论(A)-简单算术表达式求值

    描述: 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运 ...

  6. HDU 1237 简单计算器 栈

    额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...

  7. HDU 1237 简单计算器(栈+stringstream)

    提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...

  8. 随手练——HDU 1237 表达式求值(输入格式典型)

    坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...

  9. 【NYOJ-35】表达式求值——简单栈练习

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

随机推荐

  1. 通过设置ie的通过跨域访问数据源,来访问本地服务

    1.首先设置通过域访问数据源 设置通过域访问数据源 2.javascript脚本ajax使用本地服务登录(评价,人证的类似)接口 <html> <head> <scrip ...

  2. Confluence 6 使用 Apache 的 mod_jk

      在 Confluence 6 及其后续版本中,不能使用 mod_jk 来做代理.这是因为 Synchrony 服务导致的这个限制. Synchrony 在协同编辑的时候需要启动,同时还不能接受 A ...

  3. Confluence 6 CSS 指南:修改顶部背景

    Confluence 默认页面的顶部是有关站点的菜单连接,在这里定义了 快速连接, 浏览菜单,用户菜单和快速查找输入框.在这个示例中,我们将会尝试修改顶部的菜单部分的背景和一些自定义的图片. 创建一个 ...

  4. 【DOS】文件统计命令

    1. 统计当前文件夹下文件的个数 ls -l|grep "^-"|wc -l 2. 统计当前文件夹下目录的个数 ls -l|grep "^d"|wc -l 3. ...

  5. WIN7 启动屏幕键盘

    点击“开始”或按快捷键“WIN”,输入“osk”后,按“回车键”确定,就可以启动屏幕键盘. 屏幕键盘 另一种方法是进入“控制面板”: 再进入“轻松访问中心”: 选择“启动屏幕键盘”,这样也可以启动屏幕 ...

  6. jQuery筛选器常用总结

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 怎么加密接口防止,API外部调用?

    服务器端与客户端各自会存储一个TOKEN,这个TOKEN我们为了防止反编译是用C语言来写的一个文件并做了加壳和混淆处理.在客户端访问服务器API任何一个接口的时候,客户端需要带上一个特殊字段,这个字段 ...

  8. springboot动态多数据源切换

    application-test.properties #datasource -- mysql multiple.datasource.master.url=jdbc:mysql://localho ...

  9. Django中模板使用

    第一步:配置 1.在工程中创建模板目录templates. 2.在settings.py配置文件中修改TEMPLATES配置项的DIRS值:TEMPLATES = [ { 'BACKEND': 'dj ...

  10. 20165206 2017-2018-2 《Java程序设计》第8周学习总结

    20165206 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 进程:进程是程序的一次动态执行过程,对应了从代码加载.执行至执行完毕的一个完整过程,这个过程 ...