四则运算表达式求值(栈的应用)
1.前/中/后缀表达式的转换(首先需要明白三者之间的转换)
规则:从左到右遍历中缀表达式的每一数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈 顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
a.初始化一空栈,用来对符号进出栈使用。
b.第一个字符是数字9,输出9,后面是符号“+”,进栈。
c.第三个字符是“(”,依然是符号,因其只是左括号,还没有配对,故进栈。
d.第四个字符是数字3,输出,总表达式为9 3,接着是“-”,进栈。
e.接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”。总的表达式为9 3 1 -。
f.接着是数字3,输出,总的表达式为9 3 1 - 3.紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,“*”进栈。
g.之后是符号“+”,此时当前栈顶元素“*”比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”更低的优先级,所以全部出栈),总输出表达式为9 3 1 - 3 * +。然后将当前这个符号“+”进栈。
h.紧接着数字10,输出,总表达式为9 3 1 - 3 * + 10。后是符号“/”,所以“/”进栈。
i.最后一个数字2,输出,总的表达式为9 3 1 - 3 * + 10 2。
j.因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为9 3 1 - 3 * + 10 2 / +。
3.后缀表达式计算结果(栈的应用)
后缀表达式为:9 3 1 - 3 * + 10 2 / +
规则为:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
a.初始化一个空栈。此栈用来对要运算的数字进行进出使用。
b.后缀表达式中前三个是、都是数字,所以9 3 1 进栈。
c.接下来是“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再讲2进栈。
d.接着是数字3进栈。
e.后面是“*”,也就意味着栈中3和2出栈,2与3相乘,得到6,并将6进栈。
f.下面是“+”,所以栈中6和9出栈,9和6相加,得到15,将15进栈。
g.接着是10和2两数字进栈。
h.接下来是符号“/”,因此,栈顶的2与10出栈,10与2相除,得到5,将5进栈。
i.最后一个是符号“+”,所以15与5出栈并相加,得到20,讲20进栈。
j.结果是20出栈,栈变为空。
- //下面的代码只是支持一些简单的整数的加减乘除运算,而且不支持浮点数,负数或者数字大于9的数字的运算,只是
- //自己简单的写一个代码,将这个过程进行的简单验证,如果需要解决复杂的计算问题,可以上网查找资料来实现!
- #include<iostream>
- #include<cstdio>
- #include<string>
- #include<stack>
- using namespace std;
- stack<char> s;
- stack<int> ss;
- int main()
- {
- int len1, len2, len, i, j;
- string str1, str2;//str1为中缀表达式,str2为后缀表达式
- while (1){
- //中缀表达式转换为后缀表达式
- getline(cin, str1);
- len1 = str1.length();
- str2.clear();
- for (i = 0; i < len1; i++){
- if (str1[i] >= '0' && str1[i] <= '9')
- str2.push_back(str1[i]);
- else{
- if (s.size() == 0 || str1[i] == '(')
- s.push(str1[i]);
- else{
- char tmp1 = s.top();
- if (str1[i] == ')'){
- len = s.size();
- while (len){
- char tmp = s.top();
- s.pop();
- if (tmp == '(')
- break;
- else
- str2.push_back(tmp);
- len--;
- }
- }
- else{
- if (tmp1 == '*' || tmp1 == '/'){
- if (str1[i] == '*' || str1[i] == '/')
- s.push(str1[i]);
- else{
- len = s.size();
- while (len){
- char tmp = s.top();
- str2.push_back(tmp);
- s.pop();
- len--;
- }
- s.push(str1[i]);
- }
- }
- else{
- s.push(str1[i]);
- }
- }
- }
- }
- }
- if (s.size() != 0){
- len = s.size();
- while (len){
- char tmp = s.top();
- str2.push_back(tmp);
- s.pop();
- len--;
- }
- }
- cout << str2 << endl;
- //由后缀表达式计算结果
- int temp1, temp2, temp3;
- len2 = str2.length();
- for (i = 0; i < len2; i++){
- if (str2[i] >= '0' && str2[i] <= '9'){
- int t = str2[i]-48;
- ss.push(t);
- }
- else{
- temp1 = ss.top();
- ss.pop();
- temp2 = ss.top();
- ss.pop();
- if (str2[i] == '+'){
- temp3 = temp2 + temp1;
- }
- else if (str2[i] == '-'){
- temp3 = temp2 - temp1;
- }
- else if (str2[i] == '*'){
- temp3 = temp2 * temp1;
- }
- else if (str2[i] == '/'){
- temp3 = temp2 / temp1;
- }
- ss.push(temp3);
- }
- }
- cout << ss.top() << endl;
- }
- system("pause");
- }
四则运算表达式求值(栈的应用)相关推荐
- c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...
- 栈的应用(递归:例子裴波那契数列 四则运算表达式求值 :后缀(逆波兰) )
递归: -栈有一个很重要的应用:在程序设计语言中实现递归. 当你往镜子前面一站,镜子里面就有-一个你的像. 但你试过两面镜子一起照吗?如果A.B两面镜子相互面对面放着,你往中间- -站,嘿,两面镜子里 ...
- 四则运算表达式求值の各种心碎
实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一 ...
- Bailian4132 四则运算表达式求值【文本处理】
4132:四则运算表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 求一个可以带括号的小学算术四则运算表达式的值 输入 一行,一个四则运算表达式.''表示乘法,'/'表示除法 ...
- 分别用C++和JavaScript 实现四则运算表达式求值
博主16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果.当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的 ...
- 栈运算 java_栈的应用——四则运算表达式求值(Java实现)
首先介绍几个概念 中缀式:平常我们所用到的标准的四则运算表达式就是中缀式,如9+(3-1)*3+10/2,这就是一个中缀式 后缀式(逆波兰式):一种不需要括号的后缀表达法,我们也把他称为逆波兰式,如将 ...
- 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
秋实大哥搞算数 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1074 Des ...
- python前缀表达式求值_python数据结构与算法 11 后缀表达式求值
从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...
- 表达式求值(数据结构栈,c语言版)
表达式求值 一.实验题目 1.案例分析 2.案例实现 3.算法步骤 4.算法描述 二.工具环境 三.实验问题 四.实验代码 一.实验题目 1.案例分析 任何一个表达式都是由操作数(operand)运算 ...
最新文章
- react组件回顶部
- 关闭不安全端口的脚步
- 读书笔记-沙漠里的细水微光
- 在FCKeditor 2.6中添加插入视频和音频功能(最新修订版)
- java.lang.UnsatisfiedLinkError: com.jacob.com.D...
- [Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
- n个数里找出前m个数(或者 从10亿个浮点数中找出最大的1万个)
- html将excel数据自动导入到网页,如何把excel表中的数据自动输入到网页中
- 多媒体计算机是多媒体教室的核心部件,浅析多媒体教室的设备配置
- 【TensorFlow】TensorFlow函数精讲之tf.constant()
- 视觉SLAM——D435i运行ORB-SLAM3-mono(依赖ros版)
- Java8 Math新增方法
- 图像识别中——目标分割、目标识别、目标检测和目标跟踪的区别
- sqlserver2008的数据库自动备份方法(转载)
- 696.计数二进制子串(力扣leetcode) 博主可答疑该问题
- UTM坐标系与GPS坐标系转换笔记
- Windows设置exe或者bat文件开机启动的几种方法汇总
- Oracle查询排列组合,Oracle SQL排列组合之组合问题
- 语音识别软件_语音识别 软件_日语语音识别软件 - 云+社区 - 腾讯云
- 正则表达式训练-QQ号校验
热门文章
- 【Android 安全】DEX 加密 ( Proguard 简介 | 默认 ProGuard 分析 )
- 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
- 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
- 【Android 应用开发】 ActionBar 基础
- Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
- JavaScript HTML DOM - 改变 CSS
- 实验0 了解和熟悉操作系统
- 机器学习公开课笔记(1):机器学习简介及一元线性回归
- perl 命令行小记
- GridView的Command命令集合