当前位置: 首页 > news >正文

表达式计算

平常写表达式,一般运算符在数的中间,比如 \(1 + 3 \times 5\),其中 \(+\)\(1\)\(3 \times 5\) 之间,\(\times\)\(3\)\(5\) 中间,这种表达式称为中缀表达式。中缀表达式对人类友好,但对计算机没那么友好。对计算机友好的表达式是“后缀表达式”,顾名思义,后缀表达式中运算符在参数的后面。对于计算机而言,后缀表达式比中缀表达式更容易计算,另外,后缀表达式的运算机制可以避免掉括号,这也是它相对于中缀表达式的一大优势。

image

计算题:中缀表达式 ((6-3)*2+7)/(5^(3*4+2)) 对应的后缀表达式为?

答案

image


选择题:表达式 a*d-b*c 的前缀形式是?

  • A. ad*bc*-
  • B. -*ad*bc
  • C. a*d-b*c
  • D. -**adbc
答案

B

转换的核心是遵循运算符的优先级

在表达式 a*d - b*c 中,乘法 * 的优先级高于减法 -。因此,必须先计算两个乘法,再计算减法。可以为表达式加上括号来明确这个运算顺序:((a * d) - (b * c))

中缀表达式 (a * d) 转前缀则是将运算符 * 提到前面,得到 * a d。同理,中缀表达式 (b * c) 转换成前缀表达式得到 * b c

经过上一步,表达式现在可以看作是 (子表达式1) - (子表达式2),而这个表达式转前缀将运算符 - 提到最前面,得到 - 子表达式1 子表达式2

所以最终结果是:- * a d * b c


后缀表达式求值

栈的一大用处是做算术表达式的计算,对于计算机来讲,它最容易理解后缀表达式,可以使用栈来 \(O(N)\) 地求出它的值。

  1. 建立一个用于存数的栈,逐一扫描该后缀表达式中的元素。
    • 如果遇到一个数,则把该数入栈。
    • 如果遇到运算符,就取出栈顶的两个数进行计算,把结果入栈。
  2. 扫描完成后,栈中恰好剩下一个数,就是该后缀表达式的值。

以后缀表达式 2 4 * 1 3 + - 为例:首先从左往右读式子,读到了乘号。乘法有两个参数,所以取出前面的 2 和 4,算出 \(2 \times 4 = 8\)。于是可以擦掉 2 4 *,写上 8,式子变成 8 1 3 + -。读到加号之后,取出前面的 1 和 3,算出 \(1+3=4\),把式子改写成 8 4 -。接着读到减号之后取出 8 和 4,算出 \(8-4=4\),于是最后的式子就是 4,这就是期望的结果。

例题:P1449 后缀表达式

参考代码
#include <cstdio>
#include <cstring>
#include <stack>
using std::stack;
const int N = 55;
char s[N];
int main()
{scanf("%s", s + 1);int len = strlen(s + 1);int num=0;stack<int> st; // 存储运算数的栈for (int i = 1; i <= len; i++) {if (s[i]>='0'&&s[i]<='9') {// 更新数字num=num*10+(s[i]-'0');} else if (s[i]=='.') {// num就作为一个运算的数字加入到栈中st.push(num);num=0;} else if (s[i]=='@') {break;} else {// +-*/// 取出栈顶的两个元素// top() 表示取栈顶// pop() 表示弹出栈顶// empty() 返回一个栈是否为空// true对应空,false对应非空int x=st.top(); st.pop();int y=st.top(); st.pop();// x和y就是最近两次压入栈中的运算数int z;if (s[i]=='+') {z=y+x;} else if (s[i]=='-') {z=y-x;} else if (s[i]=='*') {z=y*x;} else {z=y/x;}st.push(z);}}printf("%d\n", st.top());return 0;
}
http://www.jsqmd.com/news/325043/

相关文章:

  • 奥古拉2026年新品实测:品质表现令人惊喜吗?农村自建房外墙砖/外立面壁画/柱子瓷砖/仿古外墙材料,奥古拉厂家排行榜单
  • 2026年武汉广告公司推荐:针对本地零售与餐饮场景获客痛点深度评测与排名
  • 2026年唐山广告公司推荐:多场景服务能力深度评价,解决预算有限与效果不彰难题
  • 2026年无锡广告公司推荐:基于多维度深度评测的权威排名与选择指南
  • 2026年比较好的静音三段力缓冲铰链/液压三段力缓冲铰链厂家推荐及选购指南
  • 2026年唐山广告公司推荐:基于实战转化与生态布局的TOP5权威榜单
  • 如何选择靠谱的本地广告服务商?2026年唐山广告公司全面评测与推荐,直击效果虚高痛点
  • 2026年比较好的离子风机/离子风机测试仪实力厂家TOP推荐榜
  • 2026年热门的弥散供氧制氧系统/弥散供氧制氧设备最新TOP厂家排名
  • 基于Java的广播电视设备巡检智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2026年口碑好的塑胶变压器骨架/BOBBIN变压器骨架高评价厂家推荐榜
  • 线下门店如何控制广告成本?2026年苏州广告公司推荐与评价,聚焦本地场景
  • 基于Java的广播电视转播播出智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2026年无锡广告公司推荐:办公生产场景深度评测,解决获客成本高昂与效率低下痛点并附排名
  • MySQL系列三(定位慢SQL、索引优化、SQL优化)Using filesort
  • Maven学习 (二) Eclipse 上安装 Maven3插件
  • 基于Java的广播电视产品备案智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2026CRM选型手册:9 大企业级CRM客户管理能力全维度测评
  • 郑州市大杨保温材料公司靠谱吗,听听客户真实评价
  • 基于java语言的工资管理系统设计与实现 开题报告
  • 基于Java的广告许可证智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2026年靠谱的在线监控光通信检测仪器/光功率计光通信检测仪器厂家最新TOP实力排行
  • 2026美赛MCM/ICM B题之借助太空电梯系统建设月球殖民地附思路和Matlab参考代码
  • 基于Java的广播器材销售智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 2026年苏州广告公司推荐:营销技术趋势权威排名,涵盖电商与本地生活场景效果转化痛点
  • 哪家唐山广告公司效果好?2026年服务商综合推荐与排名,解决技术与落地核心痛点
  • 杰理之IIS 的核心作用【篇】
  • 2026年职业教育升学,安徽万通技师学院的服务靠谱吗
  • 计算机大数据毕业设计Django+LLM大模型股票行情预测系统 量化交易分析预测系统 大数据毕设(源码+LW+PPT+讲解)
  • 2026年聊城专业的螺旋钢管供应企业推荐与价格揭秘