(11)数据结构-栈应用-简易计算器
1、简介
离散数学中学过将中缀表达式转化为后缀表达式,再进行求解。因此,在求解中缀表达式结果时需要分两步。转化、求解。
1.1 转化
如何将一个中缀表达式转化为后缀表达式。
使用栈st1与栈st2,从左向右扫描中缀表达式
- 如果是操作数,直接压入st1
- 如果是操作符,考虑当前操作符与st2栈顶的优先级关系。
– 如果高于栈顶的优先级,则直接压入st2
–如果低于或等于栈顶的优先级,则将st2中所有操作符依次出栈并压入st1。 结束以后将当前操作符压入st2。 - 扫描完中缀表达式以后,如果st2还有剩余操作符,那么将st2中操作符依次出栈压入st1。
1.2 求解
使用一个栈st,从左向右扫描后缀表达式
- 如果是操作数,直接压入st,
- 如果是操作符,将st次栈顶与st栈顶元素(
注意顺序不能变
)之间进行操作,运算结果压入st.。
2、 代码实现
#include<iostream>
#include<stack>
#include<string>
#include<cctype>
#include<map>using namespace std;
typedef double ElemType;
bool flag = true;
map<char,int>op;string Transfer(string s);
ElemType cal(string s);int main(){string s;cin >> s;string sm = Transfer(s);cout << sm << endl;ElemType result = cal(sm);if(flag){cout << result;}else{cout << "ERROR" << endl;}return 0;}
string Transfer(string s){stack<char> st1;stack<char> st2;op['*'] = op['/'] = 2;op['+'] = op['-'] = 1;for (int i = 0; i < s.length(); i++){char ch = s[i];if(isdigit(ch)){st1.push(ch);continue;}else{//如果该操作符的优先级低于或等于st2栈顶优先级//把st2中每一个操作福压到st1中while(!st2.empty() && op[ch] <= op[st2.top()]){st1.push(st2.top());st2.pop();}//结束以后,再将改操作符压入st2中st2.push(ch);}}//如果st2还有,全部压入st1即可while(!st2.empty()){st1.push(st2.top());st2.pop();}string st = s;for(int i = s.length()-1; i >= 0; i--){st[i] = st1.top();st1.pop();}return st;}ElemType cal(string s){stack<ElemType> st;for(int i = 0; i < s.length(); i++){char ch = s[i];if(isdigit(ch)){st.push(ch-'0');}else{ElemType b = st.top();st.pop();ElemType a = st.top();st.pop();ElemType c;switch (ch) {case '+':c = a + b;break;case '-':c = a -b;break;case '*':c = a * b;break;case '/':if(b == 0){flag = false;break;}else{c = a / b;}break;}st.push(c);}}return st.top();
}
3、缺点
上面的代码只能解决操作数都为整数的情况,但是实际使用中,浮点数才是最常见的使用。
(11)数据结构-栈应用-简易计算器相关推荐
- 数据结构:栈实现简易计算器
文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...
- (C语言)栈应用简易计算器实现
//利用栈实现简易计算器,进行包含+,-,*,/,(,)间的计算 #include<stdio.h> #include<string.h> #define MaxSize 10 ...
- evaluate函数使用无效_[Python实战]使用栈实现简易计算器
我们这次实现的命令行计算器,支持加减乘除.括号.浮点数.负数,以及查看历史和退出功能. 主要的思路:read - parse - print - loop. read 阶段是指读取用户在提示符(cal ...
- 数据结构课设-简易计算器
项目3:算术表达式计算器 目标:实现简单的计算:+.-.*./.(.) 实现思路: [按照先乘除后加减,先左后右,先括号里后括号外的顺序,得到操作符优先关系表(7*7的二维数组] 1,创建两个栈:存放 ...
- java栈实现简易计算器算法
问题描述: 对于任意字符串,包含+ - * /和括号, 求出该表达式的值 首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如: -1+(-2)*3 遇到负号怎么 ...
- 11.0、C语言数据结构——栈
11.0.C语言数据结构--栈 栈的定义: 栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式: 官方定义:栈(stack)是一个 后进先出(Las ...
- c语言特殊计算器设计报告,C语言数据结构栈计算器的实现课题设计报告书
C语言数据结构栈计算器的实现课题设计报告书 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 目录1. 课程设计任务 12. 需求分析 ...
- 栈趣用---中缀表达式实现简易计算器
中缀表达式:我们日常生活中用的表达式就是中缀表达式,比如4+5*6-7,它的特点就是人容易理解和计算,但是计算机不买账,对于中缀表达式,计算机实现起来复杂度很高,这里模拟了计算机计算中缀表达式过程,实 ...
- 【Java数据结构与算法】第四章 栈实现综合计算器
第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...
- 【数据结构与算法 6】栈实现综合计算器
一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...
最新文章
- oracle分组汇总人数,Oracle实现分组统计记录
- cghhhhhhhhhhhhhhhhhh
- 周末狂欢赛3(跳格子,英雄联盟,排序问题)
- 线性表----循环链表和静态链表
- android string数组转json_移动端开发基础【20】pages.json的配置项pages
- c语言函数能改变指针吗,如何修改传递给C中函数的指针?
- 分析解决logcat报read: Unexpected EOF!异常
- 一个web图片热点生成工具(winform开发) 附源码
- AR导航真的有前途,马云领衔1亿2500万投资
- 深度学习优化算法入门:二、动量、RMSProp、Adam
- C# NOPI读取Excel
- mysql有if选择更新_使用IF条件的MySQL更新
- 旧式有线打印机联网探索
- windows 清除IE浏览器缓存的脚本
- 企业微信url及生成授权链接
- 服装行业ERP体系的主要好处
- C#简单实现摄影测量后方交会
- Swift网络请求框架Moya的使用
- 2022.10.27
- Ubuntu20.04 LTS 卡顿问题(卡顿间隔固定)
热门文章
- windows xp下Apache2.2.11整合Tomcat6.0.20
- DenseNet翻译:Densely Connected Convolutional Networks
- LightGBM-GBDT-LR使用树集合进行特征转换
- Java锁Synchronized,对象锁和类锁举例
- 年入百万的表弟给我上一课:互联网思维该怎么接地气
- SpringMVC + AJAX 实现多文件异步上传
- 区块链教程Fabric1.0源代码分析putils(protos/utils工具包)
- GraphQL的JavaScript实现graphql-js应用举例
- OSChina 周二乱弹 ——追风的少年已经阵亡
- 多个Tomcat同时运行环境配置 - imsoft.cnblogs