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)数据结构-栈应用-简易计算器相关推荐

  1. 数据结构:栈实现简易计算器

    文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...

  2. (C语言)栈应用简易计算器实现

    //利用栈实现简易计算器,进行包含+,-,*,/,(,)间的计算 #include<stdio.h> #include<string.h> #define MaxSize 10 ...

  3. evaluate函数使用无效_[Python实战]使用栈实现简易计算器

    我们这次实现的命令行计算器,支持加减乘除.括号.浮点数.负数,以及查看历史和退出功能. 主要的思路:read - parse - print - loop. read 阶段是指读取用户在提示符(cal ...

  4. 数据结构课设-简易计算器

    项目3:算术表达式计算器 目标:实现简单的计算:+.-.*./.(.) 实现思路: [按照先乘除后加减,先左后右,先括号里后括号外的顺序,得到操作符优先关系表(7*7的二维数组] 1,创建两个栈:存放 ...

  5. java栈实现简易计算器算法

    问题描述: 对于任意字符串,包含+ - * /和括号, 求出该表达式的值 首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如: -1+(-2)*3       遇到负号怎么 ...

  6. 11.0、C语言数据结构——栈

    11.0.C语言数据结构--栈 栈的定义:         栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式:         官方定义:栈(stack)是一个 后进先出(Las ...

  7. c语言特殊计算器设计报告,C语言数据结构栈计算器的实现课题设计报告书

    C语言数据结构栈计算器的实现课题设计报告书 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 目录1. 课程设计任务 12. 需求分析 ...

  8. 栈趣用---中缀表达式实现简易计算器

    中缀表达式:我们日常生活中用的表达式就是中缀表达式,比如4+5*6-7,它的特点就是人容易理解和计算,但是计算机不买账,对于中缀表达式,计算机实现起来复杂度很高,这里模拟了计算机计算中缀表达式过程,实 ...

  9. 【Java数据结构与算法】第四章 栈实现综合计算器

    第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...

  10. 【数据结构与算法 6】栈实现综合计算器

    一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...

最新文章

  1. oracle分组汇总人数,Oracle实现分组统计记录
  2. cghhhhhhhhhhhhhhhhhh
  3. 周末狂欢赛3(跳格子,英雄联盟,排序问题)
  4. 线性表----循环链表和静态链表
  5. android string数组转json_移动端开发基础【20】pages.json的配置项pages
  6. c语言函数能改变指针吗,如何修改传递给C中函数的指针?
  7. 分析解决logcat报read: Unexpected EOF!异常
  8. 一个web图片热点生成工具(winform开发) 附源码
  9. AR导航真的有前途,马云领衔1亿2500万投资
  10. 深度学习优化算法入门:二、动量、RMSProp、Adam
  11. C# NOPI读取Excel
  12. mysql有if选择更新_使用IF条件的MySQL更新
  13. 旧式有线打印机联网探索
  14. windows 清除IE浏览器缓存的脚本
  15. 企业微信url及生成授权链接
  16. 服装行业ERP体系的主要好处
  17. C#简单实现摄影测量后方交会
  18. Swift网络请求框架Moya的使用
  19. 2022.10.27
  20. Ubuntu20.04 LTS 卡顿问题(卡顿间隔固定)

热门文章

  1. windows xp下Apache2.2.11整合Tomcat6.0.20
  2. DenseNet翻译:Densely Connected Convolutional Networks
  3. LightGBM-GBDT-LR使用树集合进行特征转换
  4. Java锁Synchronized,对象锁和类锁举例
  5. 年入百万的表弟给我上一课:互联网思维该怎么接地气
  6. SpringMVC + AJAX 实现多文件异步上传
  7. 区块链教程Fabric1.0源代码分析putils(protos/utils工具包)
  8. GraphQL的JavaScript实现graphql-js应用举例
  9. OSChina 周二乱弹 ——追风的少年已经阵亡
  10. 多个Tomcat同时运行环境配置 - imsoft.cnblogs