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

输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
输出:
3.00
13.36

这种类型题写了很多,但每次变化一点点就会卡很久,而且中缀转后缀也一直不熟练。。今天再用两种方法总结一次

方法一:后缀式法

相比于之前写的中缀式转后缀式,遇到的问题有:

  1. 常量不再用a,b,c表示,而是具体的常数,这就导致不再能用一个字符栈来存储后缀表达式,必须将操作数从字符串中提取并组合起来,再用操作数栈和运算符栈分开存放。
  2. 总是思维惯性的想着求出后缀式之后,再用一个栈对后缀式求值,然而在不能用一个字符栈存后缀式的情况下,这是很复杂的。其实可以在每次向后缀式添加运算符时直接求值啊!
  3. 56和61两行写错了,在vs下才找出问题
#include<bits/stdc++.h>
using namespace std;map<char,int> isp;
map<char,int> icp;
stack<double> num;    //操作数栈
stack<char> s;       //运算符栈
string str;        //键盘输入的中缀式
string post;    //后缀式  但在本题中,每次向后缀式添加运算符时 改为直接计算即可,故无需用到后缀式 int getNum(int i)
{double numb = 0;while(str[i] >= '0' && str[i] <= '9') {numb = numb * 10 + str[i++] - '0'; }num.push(numb);return i;
}void cal(char op)
{double s2 = num.top();num.pop();double s1 = num.top();num.pop();
//  cout << s1 << op << s2 << endl;switch(op){case '+':num.push(s1+s2); break;case '-':num.push(s1-s2);   break;case '*':num.push(s1*s2);   break;case '/':num.push(s1/s2);   break;}
}int main()
{isp['*'] = 5;isp['/'] = 5;isp['+'] = 3;isp['-'] = 3;icp['*'] = 4;icp['/'] = 4;icp['+'] = 2;icp['-'] = 2;while(getline(cin,str)){//num.clear(); s.clear(); 栈好像没有clear()方法,不过不清空也问题不大 for(int i=0;i<str.length();i++){if(str[i] == ' ')continue;else if(str[i] >= '0' && str[i] <= '9')i = getNum(i);  //返回的i指向操作数后的空格 ,操作数存在操作数栈中 else{ //运算符 if(s.empty() || icp[str[i]] > isp[s.top()])s.push(str[i]);else{while(!s.empty() && icp[str[i]] < isp[s.top()]){ //!s.empty()必须写在前面(思考原因)//                    post += s.top();//要求输出后缀式时的写法 cal(s.top());   //直接计算的写法 s.pop();}s.push(str[i]); //差点忘记 } } }while(!s.empty()){cal(s.top());//        post += s.top();//s.pop();}printf("%.2f\n",num.top());  //栈顶元素即为最终答案 }
}

方法二:直接扫描

这种方法很贴近正常思维,先对*/运算,再对+ -运算,最后统一运算。
但问题是如果题目中还要求考虑括号对优先级的影响,怕是就无能为力了,但不失为一个好方法。

#include<iostream>
using namespace std;
int main()
{int d = 0, pos = -1; char op = {0};double nums[201] = { 0 };while (cin>>d)  //取第一个操作数{if (-1 == pos && 0 == d && '\n' == getchar()) break;nums[++pos] = d;while (cin>>op>>d)  //后面每次连运算符带操作数一起取{switch (op){case '+': nums[++pos] = d; break;   //加减,在下一个位置储存case '-': nums[++pos] = -d; break;case '*': nums[pos] *= d; break;    //乘除,就在原地处理case '/': nums[pos] /= d; break;}}double sum = 0; while (pos >= 0) sum += nums[pos--];  //最后统一进行加运算printf("%.2f\n", sum); getchar();}return 0;
}

简单计算器——两种方法相关推荐

  1. c语言如何编程出声音,C/C++知识点之C语言播放声音最简单的两种方法

    本文主要向大家介绍了C/C++知识点之C语言播放声音最简单的两种方法,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.1. 如果仅需要播放波形文件wav格式的声音,很简单,只需一句话 ...

  2. .net 添加word水印_PDF如何添加水印?方法如此简单,两种方法任你选择

    PDF如何添加水印? 如何快速地给PDF文件添加水印呢?给PDF加水印这个方法很有朋友可能不太知道,今天,小编给大家介绍两个添加水印的简单方法,可以迅速给PDF文件添加水印,一起来看一下吧! 工具/原 ...

  3. PHP获取网页源码最简单的两种方法

    第一种:curl 废话不多说,直接上代码 //1,获取curl句柄 $ch = curl_init();// 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL,&qu ...

  4. js删除指定html及子标签,js中如何删除某个元素下面的所有子元素?(两种方法)...

    js中如何删除某个元素下面的所有子元素?(两种方法) 一.总结 方法一:通过元素的innerHTML属性 元素element.innerHTML=""; 方法二:通过元素的remo ...

  5. 怎么在mac打开home文件夹? mac打开home文件夹的两种方法

    今天小编给大家带来怎么在mac打开home文件夹? mac打开home文件夹的两种方法教程,那么具体该怎么打开呢?下面我们就来看看mac打开home文件夹的两种方法,需要的朋友可以参考下.记得收藏哦 ...

  6. 计算机在表格底部插入一空行怎么弄,简单高效的Excel技巧,表格隔行插入空行,这两种方法很实用...

    在对Excel表格进行操作的时候,我们有时候会碰到一个难题,那就是怎么在原表格中,隔行插入空行,以便于我们补充新增新的数据. 简单高效的Excel技巧,表格隔行插入空行,这两种方法很实用 如上图所示, ...

  7. JAVA中初始化线程的两种方法_java中最简单的方式新起一个线程

    启动一个线程 在一个方法中启动一个线程,有两种方法 第一种是让类实现Runable接口,这样的话编译器就会提示你实现里面的未实现的方法(就是run方法) 第二种是,现在方法中new一个线程,然后直接调 ...

  8. php随机缩略图,实现随机缩略图的简单思路和phpcms随机缩略图两种方法

    一种实现随机缩略图的简单思路:设置一个随机缩略图图片池(比如thumb文件夹),里面放若干张从"1.jpg"开始顺序命名的预置图片,判断无缩略图时,使用php的mt_rand(1, ...

  9. html广告框,给WordPress首页添加简单广告框弹窗两种方法实现代码+插件

    最近大家访问我的博客想必都看到了图片广告弹窗 话说虽然用户不喜欢,但是作为站长的我们却非常需要,毕竟我们也不是用爱发电,也是需要赚点打广告赚点外快来补贴服务器费用的.今天逛夏末浅笑博客的时候看到了这个 ...

  10. 如何查询期刊的缩写?(轻松简单教你两种方法)

    我们在引用参考文献格式要求,或者写申请材料等会用到期刊名称的缩写,这里小编分享两种简单的方式,帮助你轻松简单的查询期刊缩写. 首先我们先来看一下期刊的全称与缩写 话不多说,直接介绍两种查询方法 方法1 ...

最新文章

  1. java xml中的冒号_Java jdom解析xml文件带冒号的属性
  2. 关于outlook 2003 PST文件大小一点说明
  3. fortran和Java学_Fortran模块和全局变量
  4. Django之Xadmin
  5. 从 0 开始手写一个 Spring MVC 框架,向高手进阶
  6. php集成环境还需要mysql吗_是选择php集成环境好还是分开安装的原生版好
  7. 打工的人面对老板是没有溢价权的
  8. Python入门你要懂哪些?这篇文章总算讲清楚了
  9. Tensorflow Timeline介绍及简单使用
  10. java五子棋人机对战_实现简单的人机对战五子棋(实践)
  11. 魅族手机便签里的备忘录内容如何导出到华为手机上?
  12. YDOOK: ANSYS Electronic Desktop Maxwell 19 教程1: 基本界面
  13. 通过同花顺股票程序化交易接口的止损方法有哪些?
  14. php 把ppt转pdf文件大小,ppt转换成pdf 怎么将ppt文件批量转换为pdf文件?ppt高质量转换pdf的方法...
  15. MySQL数据库整理
  16. 用MDT 2012为企业部署windows 7(十)--制作windows 7标准模板机
  17. NR/5G - Timing Advance
  18. newman执行测试_用Postman/Newman搞定API测试
  19. IEEE Communications Letters - cover letter
  20. JsBarcode:JS条形码生成

热门文章

  1. 7-7自动色阶/自动对比度/自动颜色
  2. 通过Windows Live Writer发布日志到各大博客
  3. 【转】阿里去IOE运动
  4. Java Access Specifier (不同的访问修饰符)
  5. RAID介绍及RAID5配置实例
  6. IRF之LACP-MAD检测
  7. BGP安全特性(华为设备)
  8. 自建CA生成证书详解
  9. Hibernate最全面试题
  10. 像写C#一样编写java代码