C语言栈的应用——后缀表达式求值
算法思路
上次已经完成了由中缀表达式转后缀表达式的算法,而后缀表达式的优点就是可以从左至右直接读取,没有算数优先级的考量,所以直接进行运算即可。
该算法需要使用一个栈用来保存操作数,在读取到数字的时候,将数字压入栈中;如果读取到操作符,就弹出栈顶的两个元素,分别为op2和op1(先弹出来的元素为op2),将op1和op2与目前读取到的操作符进行计算,并将结果压回栈中。反复运行直到后缀表达式全部读取完成,此时栈中的结果即后缀表达式的结果。
具体过程
例后缀表达式12+3-45*2/+
,定义一个栈num
来保存数字,顺序读取后缀表达式。
- 读取到数字
1
,将其压入栈中,此时num = ['1']
- 读取到数字
2
,将其压入栈中,此时num = ['1','2']
- 读取到操作符
+
,将栈顶的两个元素弹出,op2=2
,op1=1
,将op1+op2
的结果压入栈中,此时num = ['3']
- 读取到数字
3
,将其压入栈中,此时num = ['3','3']
- 读取到操作符
-
,将栈顶的两个元素弹出,op2=3
,op1=3
,将op1-op2
的结果压入栈中,此时num = ['0']
- 读取到数字
4
,将其压入栈中,此时num = ['0','4']
- 读取到数字
5
,将其压入栈中,此时num = ['0','4','5']
- 读取到操作符
*
,将栈顶的两个元素弹出,op2=5
,op1=4
,将op1*op2
的结果压入栈中,此时num = ['0','20']
- 读取到数字
2
,将其压入栈中,此时num = ['0','20','2']
- 读取到操作符
/
,将栈顶的两个元素弹出,op2=2
,op1=20
,将op1/op2
的结果压入栈中,此时num = ['0','10']
- 读取到操作符
+
,将栈顶的两个元素弹出,op2=10
,op1=0
,将op1+op2
的结果压入栈中,此时num = ['10']
- 后缀表达式读取完毕,此时栈
num
的内容即后缀表达式的结果。
代码实现
// 后缀表达式求值
void postfixEval()
{char postfixList[100] = {0}; // 使用char类型数组保存后缀表达式printf("请输入将要求值的后缀表达式:\n");scanf("%s", postfixList);getchar();int length;length = (int) strlen(postfixList);LiStack num; // 定义栈num保存数字,并定义num = initStack();for (int i = 0; i < length; i++){if (isdigit(postfixList[i])){int nums = asciiToint(postfixList[i]); // 因为在char类型中保存数字是ascii码类型,所以需要将其转义,具体函数在下方push(num, nums); // 将数字压入栈中}else{int second = pop(num);int first = pop(num);push(num, domatch(first, postfixList[i], second)); // 调用domatch(定义在下方),将对应结果再次压入栈中}}printf("该表达式的值为%d\n", pop(num));
}// 将ascii码转化为整形int asciiToint(char ascii)
{// 因为在ascii码中,48表示0,49表示1……将ascii-'0',就是将对应数字的ascii码减去48,结果就是十进制中的数字int i = ascii - '0';return i;
}// 算数求值
int domatch(int op1, char op, int op2) // 将char类型的运算符进行相应的运算
{int first = (int)op1, second = (int)op2;if (op == '*'){return first * second;}else if(op == '/'){return first / second;}else if (op == '+'){return first + second;}else{return first - second;}
}
C语言栈的应用——后缀表达式求值相关推荐
- 栈应用:后缀表达式求值
在上一篇博客 栈应用:中缀表达式转后缀表达式 中我们知道如何通过栈将中缀表达式转为后缀表达式,这次我们继续用栈 来实现后缀表达式求值,结合上一篇博客. 上一篇博客中是用c语言实现的,由于c语言中不支持 ...
- 基于栈的后缀表达式求值(洛谷P1449题题解,Java语言描述)
题目要求 P1449题目链接 分析 给出后缀表达式求值,就相当于没了括号,而且很直接. 我们需要使用栈结构来完成任务. Java原装的栈使用了很多synchronized,导致性能不佳,但我们也就将就 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- php表达式求值,PHP实现基于栈的后缀表达式求值功能
本文实例讲述了PHP实现基于栈的后缀表达式求值功能.分享给大家供大家参考,具体如下: 后缀表达式概述 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左 ...
- python前缀表达式求值_python数据结构与算法 11 后缀表达式求值
从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...
- java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)
数据结构之后缀表达式求值(java实现) 前记 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...
- 后缀表达式求值和转换(C++)
中缀转后缀 #include<stdio.h> #include<stack> using namespace std; stack<int> s; int com ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- 【数据结构】详解栈的应用之表达式求值
首先明白: 前缀表达式:符号在前,如-×+3456 中缀表达式:符号在中间,如(3 + 4) × 5 - 6 后缀表达式:符号在最后,如34+5×6-,后缀表达式不出现括号. 中缀表达式转后缀表达式的 ...
最新文章
- 100多个Jupyter精选资源合集!GitHub高赞,包括项目、库、教程等11个方面
- Java之进程与线程练习
- php5.0 aes加解密,PHP的aes加解密算法
- split逗号分割中文出现乱码java_Java中URL传中文时乱码的问题解决方案
- 深入理解redis数据类型
- day53-Django之路由系统
- php time java_java 时间戳和PHP时间戳 的转换 php time()
- 位置式PID与增量式PID区别浅析
- 所有的营销政策都需要做局
- 珞珈一号影像辐射定标软件操作方法
- 排除包_冷水机压缩机压缩机常见故障和排除方法
- Java基础,双色球系统实现,完整版本,没有BUG,完整代码版
- python调用大漠插件、检测么_python调用大漠插件教程05字库
- 宽带波束形成及MATLAB实现
- 【Coverity】Jenkins 的 Synopsys Coverity plugin参数配置详解
- PHP显示了验证码但不能登陆,thinkphp5 登陆后台验证码无法显示
- Raspberry Pi树莓派分类和其相似产品介绍
- 2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】
- 短暂的人生、脆弱的生命
- 开源虚拟机工具_使用开源工具与虚拟乐高玩