后缀表达式

栈的应用:后缀表达式与中缀表达式

无人久伴 提交于 2020-04-06 15:14:05
一个数学的运算式子说明两者区别 中缀表达式:4.99 * 1.06 + 5.99 + 6.99 * 1.06。 后缀表达式:4.99 1.06 * 5.99 + 6.99 1.06 * + 这里的后、中是通过运算符在数字的位置。中:在数字之间;后:在两个数字之后。 中缀转后缀: 两个栈。一个存结果为A,一个存运算符为B。一直读取表示式。运算符通过优先级高低比大小。步骤A: 遇到数字直接压入A栈 遇到运算符c。栈B空则把c压入;否则,B弹栈得到d,与c计较 若 d >= c:d 入栈A,c 入栈B 若 d < c : d 入栈B,c入栈B 读取完毕,把栈B全部弹出,压入A 后缀表达式进行运算 把步骤A修改一下: 遇到数字直接压入A栈 遇到运算符c。栈B空则把c压入;否则,B弹栈得到d,与c计较 若 d >= c:c 入栈B;A两次弹出得到数字与d运算,得到结果压入A 若 d < c : d 入栈B,c入栈B 存在括号情况的中缀转后缀 还是两个栈A与B。优先级为 ( > * > + 。 有如下式子: a + b * c + (d * e + f) * g 转换后: abc * + de * f + g * + 遇到数字压入栈A。 遇到右括号 ) ,B弹出元素,直到遇到左括号 ) 遇到 ( 、 * 、 + 任何一个运算符a。B弹出元素b,如果b>=a,就一直弹出压入A

Java 蓝桥后缀表达式

好久不见. 提交于 2020-03-09 00:28:57
给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, · · · , AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M + 1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个? 请你输出这个最大的结果。 例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。 【输入格式】 第一行包含两个整数 N 和 M。 第二行包含 N + M + 1 个整数 A1, A2, · · · , AN+M+1【输出格式】 输出一个整数,代表答案。 【样例输入】 1 1 1 2 3 【样例输出】 4 分析:先对进行计算的数字进行排列,然后强M个数进行相加,其余的N+1个数进行相加,最后的和进行相减可得; 代码如下: import java.util.Scanner; public class cxl { public static void main(String[] args) { int N=0,M=0,sum=0; Scanner input=new Scanner(System.in); N=input.nextInt(); M=input.nextInt(); int a[]=new int [N+M+1]; for(int i=0;i<a.length;i++) { a[i]=input

前缀、中缀、后缀表达式转换详解

回眸只為那壹抹淺笑 提交于 2020-03-05 16:10:44
[toc] 前缀、中缀、后缀表达式转换详解 1:表达式 1.1 、 如有1 + (( 2 + 3)* 4 ) – 5表达式,各个表达式如下 ​ 前缀:- + 1 * + 2 3 4 5 ​ 中缀:1 +(( 2 + 3 )* 4 )-5 ​ 后缀:1 2 3 + 4 * + 5 – 2:转换方式 2.1、中缀表达式转后缀表达式的两种方法 2.1.1 、方法一:直接转换法 ​ (1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 ) ​ (2)从最里面的一层括号开始运算,转换成后缀表达式的方法为:(忽略括号)数字在前,符号在后。 ​ 1)( 2 + 3) => 23+ ​ 2) (( 2 + 3)* 4 ) => 23+4* ​ 3) (1 + (( 2 + 3)* 4 ))=> 123+4*+ [按照运算次序,从左到右排列] ​ 4)((1 + (( 2 + 3)* 4 )) – 5 )=> 123+4*+ 5- ​ 后缀表达式为:1 2 3 + 4 * + 5 – 2.1.2 、方法二:利用表达式树 ​ 首先将中缀表达式转换为表达式树,然后后序遍历表达式树,所得结果就是后缀表达式。将中缀表达式转化为表 达式树的方法:表达式树的树叶是操作数,而其他节点为操作符,根结点为优先级最低且靠右的操作符(如上述表达 式优 先级最低是-和+,但

中缀表达式转后缀表达式画图详解和代码实现

雨燕双飞 提交于 2020-02-11 18:34:32
中缀表达式转后缀表达式思路步骤分析 : 1 初始化两个栈:运算符栈s1和存储中间结果的栈s2 2 从左至右扫描中缀表达式 3 遇到运算符时,比较其与s1栈顶运算符的优先级 3.1 如果s1为空,或栈顶运算符为左括号’(’,则直接将此运算符入栈; 3.2 否则,如果优先级比栈顶运算符的高,也直接将此运算符入栈; 3.3 否则,将s1栈顶的运算符弹出并压入s2中。然后又从3.1步开始进行比较(此时带入栈的操作符还是之前那个,只是栈顶元素已变更) 4 遇到操作数时,将其压入s2 5 遇到括号时 5.1 如果是左括号’(’,则直接压入s1 5.2 如果是右括号’)’,则依次弹出s1栈顶的运算符,并压入s2中,直到遇到左括号’('为止,将这个左括号从s1中弹出丢弃(这时候消除了一对括号) 6 重复2~5步,直到中缀表达式扫描完成 7 将s1中剩余的运算符依次弹出并压入s2中 8 依次弹出s2中的元素并输出,并将输出结果逆序,即得到后缀表达式 以中缀表达式1+((2+3)x4)-5举例 : (1)当扫描完1+((2+3后,s1和s2栈元素如下 (2)扫描到一个右括号’)’: (3)扫描到一个乘号和数字4: (4)扫描到一个右括号’)’: (5)扫描到一个减号和5: (6)将s1中剩余的运算符依次弹出并压入s2中 (7)依次弹出s2中的元素并输出,并将输出结果逆序,即得到后缀表达式 s2出栈:-

中缀表达式转后缀表达式

岁酱吖の 提交于 2020-02-06 05:46:51
中缀表达式转后缀表达式 简单介绍 中缀表达式是我们熟悉的表达式,如1 - 2 + 3 * (4 / 2) 而后缀表达式(也叫逆波兰表达式)是方便计算机运算的表达式,如1 2 - 3 4 2 / * + 为了方便写程序计算,我们通常把中缀表达式转换成后缀表达式,其运用的思想就是 栈 了 算法实现 我们用一个栈来调整运算符之间的先后顺序 1.数字没有先后关系直接添加到后缀表达式中 2.+ - 优先级最低,碰到时先让栈里元素出栈添加到后缀表达式中直到栈为空或栈顶元素为 ( 时再入栈 3.* / 优先级较高可以直接进栈 4.( 优先级较高也可以直接进栈 5.) 表示括号内的运算符处理完成,将栈里元素出栈添加到后缀表达式直到 ( 出栈为止 6.重复1~5步骤直到中缀表达式转换完成 具体代码见实现代码中的transform函数 实现代码 # include <bits/stdc++.h> using namespace std ; string transform ( string str ) { string :: iterator it = str . begin ( ) ; stack < char > s ; string expression ; while ( it != str . end ( ) ) { int element = 0 ; if ( isdigit ( * it

P1449 后缀表达式(C++_模拟_栈)

僤鯓⒐⒋嵵緔 提交于 2020-02-02 05:41:34
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。 输入格式 输入:后缀表达式 输出格式 输出:表达式的值 输入输出样例 输入 #1 3.5.2.-*7.+@ 输出 #1 16 说明/提示 字符串长度,1000内。 思路 放在栈里面就可以完美模拟~ 源码 # include <bits/stdc++.h> using namespace std ; int main ( ) { int s = 0 , a , c ; char temp ; stack < int > b ; while ( 1 ) { cin >> temp ; if ( temp == '@' ) break ; switch ( temp ) { case '+' : a = b . top ( ) ; b . pop ( ) ; c = b . top ( ) ; b . pop ( ) ; b . push ( a + c ) ; break ; case '-' : a = b . top ( ) ; b . pop ( ) ; c = b . top ( ) ;

结对编程

一曲冷凌霜 提交于 2020-01-28 00:33:25
学号1:211606367 姓名:林恩 学号2:211606445 姓名:肖志豪 一、预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 • Estimate • 估计这个任务需要多少时间 30 30 Development 开发 600 560 • Analysis • 需求分析 (包括学习新技术) 70 50 • Design Spec • 生成设计文档 50 70 • Design Review • 设计复审 20 30 • Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 20 • Design • 具体设计 185 185 • Coding • 具体编码 185 185 • Code Review • 代码复审 30 30 • Test • 测试(自我测试,修改代码,提交修改) 30 30 Reporting 报告 60 50 • Test Repor • 测试报告 30 30 • Size Measurement • 计算工作量 10 10 • Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 10 20 合计 690 640 二、需求分析 我通过百度的方式了解到

前缀、中缀、后缀表达式

白昼怎懂夜的黑 提交于 2020-01-27 23:50:54
它们之间的区别在于运算符相对与操作数的位置不同。 将中缀表达式转换为前缀表达式: 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时: (5-1) 如果是右括号“)”,则直接压入S1; (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最左边; (7) 将S1中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。 例如,将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下: 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 5 5 空 数字,直接入栈 - 5 - S1为空,运算符直接入栈 ) 5 - ) 右括号直接入栈 4 5 4 - ) 数字直接入栈 × 5 4 -

09 - 逆波兰计算器

China☆狼群 提交于 2020-01-26 11:55:03
1. 前缀表达式 (波兰表达式) 前缀表达式的 运算符位于操作数之前 【举例说明】 (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式的计算机求值 从右至左 扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果 【举例说明】针对上例的前缀表达式求值步骤如下 (栈顶 ▢ 次顶) : 从右至左扫描,将6、5、4、3压入堆栈 遇到 + 运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈 接下来是 × 运算符,因此弹出7和5,计算出7×5=35,将35入栈 最后是 - 运算符,计算出 35-6 的值,即29,由此得出最终结果 2. 中缀表达式 中缀表达式就是 常见的运算表达式 ,如(3+4)×5-6 中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作(08-案例就能看的这个问题),因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式) 3. 后缀表达式 (逆波兰表达式) 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是 运算符位于操作数之后 【举例说明】 (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 –

关于后缀表达式和中缀表达式的思考

我们两清 提交于 2020-01-23 02:28:43
众所周知啦,我们数学里面的公式就是中缀表达式(infix),形如a*(b+c),支持括号用于调整运算的顺序。我们平常用的就是中缀表达式。 那么什么是后缀表达式(postfix)? 后缀表达式(又称为逆波兰reverse polish)就是不需要括号就可以实现调整运算顺序的一种技法。 比如:ab+cde+** 上面就是一个典型的后缀表达式,将它改为中缀表达式其实是(a+b)*((d+e)*c)。我们这样将后缀表达式转换成中缀表达式,虽然符合我们的数学计算习惯,但是并不符合计算机运算的方式。我们可以通过数据结构中的栈来理解后缀表达式和它为什么符合计算机计算。 什么是栈(stack)呢?简单的说就是LIFO(后入先出)。画一张图就是下面这样 堆栈的操作其实很简单,你可以把堆栈想象成一个汉诺塔,你可以在塔顶不断加上汉诺圈,可以从顶部一个一个拿走,但是你不能直接从下面拿走最先放的那个圈。所以你懂了吧,要想拿到最先那个,你必须取出所有的圈,而你最后摆上去的圈可以被立刻拿到。这就是LIFO的本质。 堆栈的实现方法可以是链表或者数组。它们各有各得优点,它们的对比网络上有很多啦,当然我以后也会写出来。 现在你知道了栈这种结构就可以重新理解一遍后缀表达式。我们就以 "ab+cde+**" 这个表达式举例。我们创建一个栈,然后从这个表达式开头(当然是从左边)扫描,如果扫描到的是数据就压(push)到栈中