文章目录

  • 题目描述
  • 一、思路
    • 1.中缀表达式转后缀表达式
    • 2.计算后缀表达式
  • 二、代码实现

题目描述

读入一个只包含+、-、*、/ 的非负整数计算表达式,计算该表达式的值。
样例输入:
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 *87 + 57 * 92
样例输出
12178.21

一、思路

1.中缀表达式转后缀表达式

①设立一个操作符栈,用来临时存放操作符;设立一个数组或者队列,用以存放后缀表达式;
②从左至右扫描中缀表达式,如果碰到操作数(可能不止一位),就把操作数加入后缀表达式中;
③如果碰到了操作符op,就将其优先级与操作符栈的栈顶操作符比较;

  • 如果op的优先级高于栈顶操作符,则压入操作符栈;
  • 如果op的优先级低于或者等于栈顶操作符,则将操作符栈的操作符不断弹出到后缀表达式中,直到op的优先级高于栈顶操作符。

④重复上述操作,直到中缀表达式扫描完毕,之后若操作符栈仍有元素(即不为空),则将它们依次弹出至后缀表达式中。

注:操作符的优先级指的是计算的优先级,即乘法=除法>加法=减法,可以使用map建立操作符和优先级的映射,1表示乘除优先级,0表示加减优先级。

2.计算后缀表达式

从左到右扫描后缀表达式,如果是操作数就压入栈,如果是操作符,就连续弹出两个操作数,然后进行操作符的操作,并将计算结果(即新的操作数)压入栈中。反复直到后缀表达式扫描完毕,此时栈内只有一个元素,为最终答案。

注:

  • 除法可能会导致浮点数,因此操作数类型要设置为浮点型;
  • 上述一切都是基于合法表达式,注意是否为非法表达式,导致操作不成功;
  • 表达式中可能存在空格,使用stringerase方法可以去除。

二、代码实现

#include <bits/stdc++.h>
using namespace std;struct node {double num;char op;bool flag;  // true means number,false means operator
};string str;
stack<node> s;  // stack of operator
queue<node> q;  // series of post-expression
map<char, int> op;
// change mid-expression to post-expression
void change() {double num;node tmp;for (int i = 0; i < str.length();) {if (str[i] >= '0' && str[i] <= '9') {  // if it is numtmp.flag = true;tmp.num = str[i++] - '0';while (i < str.length() && str[i] >= '0' && str[i] <= '9') {tmp.num = tmp.num * 10 + (str[i] - '0');i++;}q.push(tmp);} else {  // if it is operatortmp.flag = false;while (!s.empty() && op[str[i]] <= op[s.top().op]) {q.push(s.top());s.pop();}tmp.op = str[i];s.push(tmp);i++;}}while (!s.empty()) {q.push(s.top());s.pop();}
}double cal_post() {// note the first number and second numberdouble tmp1, tmp2;node cur, tmp;while (!q.empty()) {cur = q.front();q.pop();// push number into stackif (cur.flag == true)s.push(cur);else {tmp2 = s.top().num;s.pop();tmp1 = s.top().num;s.pop();tmp.flag = true;if (cur.op == '+')tmp.num = tmp1 + tmp2;else if (cur.op == '-')tmp.num = tmp1 - tmp2;else if (cur.op == '*')tmp.num = tmp1 * tmp2;elsetmp.num = tmp1 / tmp2;s.push(tmp);}}return s.top().num;
}int main() {op['+'] = op['-'] = 1;op['*'] = op['/'] = 2;while (getline(cin, str), str != "0") {for (string::iterator it = str.begin(); it != str.end(); it++) {if (*it == ' ') str.erase(it);}while (!s.empty()) {s.pop();}change();printf("%.2f\n", cal_post());}return 0;
}

简单计算器(中缀转后缀)相关推荐

  1. 数据结构实验报告(二)简单计算器(中缀转后缀)

    报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...

  2. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

  3. iOS仿写计算器中缀转后缀 表达式求值

    github地址 iOS计算器 准备工作 由于OC没有自带的栈文件,只能链表模拟栈 typedef struct {char data[50];int top; }Stack;//符号栈 //之前把D ...

  4. 计算器:中缀转后缀与后缀的计算

    分别写了中缀转后缀,用后缀进行计算的两个源文件,后来想着干脆把它们连起来做个计算器吧.两个栈的声明完全可以合成一个类模板,不过既然复制粘贴很方便,就没去修改.而且这样一个是数组栈,而另一个是链表栈,也 ...

  5. 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版

    南故笙烟:中缀表达式转为后缀表达式​zhuanlan.zhihu.com 思路分析 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将其压入s2 4 ...

  6. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  7. 完整版逆波兰计算器(中缀转后缀,多位数运算)的解析和代码

    先把中缀表达式转换为ArrayLIst的形式, 通过subString 和charAt,来扫描数字和字符,注意这里的索引i不是for循环,而是while while(i小于字符串长度 :是符号就add ...

  8. 使用Qt做一个简单计算器

    title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...

  9. 实验一 简单计算器的实现(QT实现)

    实现效果 简单计算器的实现 实验内容: 学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序: 能通过界面按钮控件输入并实现 ...

  10. 课程设计:简单计算器的实现

    一.设计目标 通过MFC应用程序创建基于对话框的简单计算器, 利用设计的按钮控件输入并实现算数表达式的运算(加.减.乘.除及括号),使表达式与运算结果在编辑框中显示,并保存历史记录. 二.算法思想 1 ...

最新文章

  1. mapgis矢量化怎么打分数_mapgis矢量化的详细工作流程
  2. 知乎千万级高性能长连接网关是如何搭建的
  3. php要求输入是个数求平均值、_【227期】EXCEL求平均值的各种套路汇聚合,最后难倒70%的人...
  4. 简单三步搭建一对一直播源码系统
  5. html gridview绑定数据,winform,devexpress GridControl中GridView数据绑定
  6. 11、1.4.3 测试JDK安装成功
  7. 八、PHP框架Laravel学习笔记——表单伪造和 CSRF 保护
  8. MySQL分库分页_MySQL分库分表的分页查询解决方案
  9. Integer中1000==1000为false而100==100为true
  10. [ubuntu] duplicated values in $PATH
  11. 追赶法求解三对角线性方程组的MATLAB程序
  12. 【sklearn第十一讲】随机梯度下降
  13. C# ToString()日期格式
  14. AndroidStudio遇到的问题
  15. Atitit 数据分析存储位置的查找方法与流程attilax总结
  16. html position属性作用,position(五种属性,以及每个属性的特点)
  17. 2021-08-3126. 删除有序数组中的重复项 数组
  18. 国际自主智能机器人大赛强势来袭,NAACL同声传译任务等你来战
  19. 小白如何连续两年美赛斩获M奖
  20. python中英文时间转换

热门文章

  1. 2019年上半年信息安全工程师下午案例题及解析
  2. tp5 File文件写入(生成静态文件)
  3. ubuntu -- (宝塔面板安装)
  4. 【每日最爱一句】2013.06.13
  5. python计算矩阵的散度_python 3计算KL散度(KL Divergence)
  6. JArray 查寻指定对象, jarray 取值
  7. 在日常中会用到的浏览器F12开发人员工具技巧
  8. 纸杯、电梯 测试用例的设计点
  9. 如何用手机上网给电信固话充值
  10. 橙心优选模式的小程序/APP开发需要多少钱?