简单计算器(中缀转后缀)
文章目录
- 题目描述
- 一、思路
- 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.计算后缀表达式
从左到右扫描后缀表达式,如果是操作数就压入栈,如果是操作符,就连续弹出两个操作数,然后进行操作符的操作,并将计算结果(即新的操作数)压入栈中。反复直到后缀表达式扫描完毕,此时栈内只有一个元素,为最终答案。
注:
- 除法可能会导致浮点数,因此操作数类型要设置为浮点型;
- 上述一切都是基于合法表达式,注意是否为非法表达式,导致操作不成功;
- 表达式中可能存在空格,使用
string
的erase
方法可以去除。
二、代码实现
#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;
}
简单计算器(中缀转后缀)相关推荐
- 数据结构实验报告(二)简单计算器(中缀转后缀)
报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...
- 顺序栈计算器 中缀转后缀表达式
顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...
- iOS仿写计算器中缀转后缀 表达式求值
github地址 iOS计算器 准备工作 由于OC没有自带的栈文件,只能链表模拟栈 typedef struct {char data[50];int top; }Stack;//符号栈 //之前把D ...
- 计算器:中缀转后缀与后缀的计算
分别写了中缀转后缀,用后缀进行计算的两个源文件,后来想着干脆把它们连起来做个计算器吧.两个栈的声明完全可以合成一个类模板,不过既然复制粘贴很方便,就没去修改.而且这样一个是数组栈,而另一个是链表栈,也 ...
- 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版
南故笙烟:中缀表达式转为后缀表达式zhuanlan.zhihu.com 思路分析 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将其压入s2 4 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 完整版逆波兰计算器(中缀转后缀,多位数运算)的解析和代码
先把中缀表达式转换为ArrayLIst的形式, 通过subString 和charAt,来扫描数字和字符,注意这里的索引i不是for循环,而是while while(i小于字符串长度 :是符号就add ...
- 使用Qt做一个简单计算器
title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...
- 实验一 简单计算器的实现(QT实现)
实现效果 简单计算器的实现 实验内容: 学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序: 能通过界面按钮控件输入并实现 ...
- 课程设计:简单计算器的实现
一.设计目标 通过MFC应用程序创建基于对话框的简单计算器, 利用设计的按钮控件输入并实现算数表达式的运算(加.减.乘.除及括号),使表达式与运算结果在编辑框中显示,并保存历史记录. 二.算法思想 1 ...
最新文章
- mapgis矢量化怎么打分数_mapgis矢量化的详细工作流程
- 知乎千万级高性能长连接网关是如何搭建的
- php要求输入是个数求平均值、_【227期】EXCEL求平均值的各种套路汇聚合,最后难倒70%的人...
- 简单三步搭建一对一直播源码系统
- html gridview绑定数据,winform,devexpress GridControl中GridView数据绑定
- 11、1.4.3 测试JDK安装成功
- 八、PHP框架Laravel学习笔记——表单伪造和 CSRF 保护
- MySQL分库分页_MySQL分库分表的分页查询解决方案
- Integer中1000==1000为false而100==100为true
- [ubuntu] duplicated values in $PATH
- 追赶法求解三对角线性方程组的MATLAB程序
- 【sklearn第十一讲】随机梯度下降
- C# ToString()日期格式
- AndroidStudio遇到的问题
- Atitit 数据分析存储位置的查找方法与流程attilax总结
- html position属性作用,position(五种属性,以及每个属性的特点)
- 2021-08-3126. 删除有序数组中的重复项 数组
- 国际自主智能机器人大赛强势来袭,NAACL同声传译任务等你来战
- 小白如何连续两年美赛斩获M奖
- python中英文时间转换