后缀表达式

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

房东的猫 提交于 2020-01-20 12:49:28
思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack = new ArrayStack2(10); //定义需要的相关变量 int index = 0;//用于扫描 int num1 = 0; int num2 = 0; int oper = 0; int res = 0; char ch = ' '; //将每次扫描得到char保存到ch String keepNum = ""; //用于拼接 多位数 //开始while循环的扫描expression while(true) { //依次得到expression 的每一个字符 ch = expression.substring(index, index+1).charAt(0); //判断ch是什么,然后做相应的处理 if(operStack.isOper(ch)) {//如果是运算符 /

后缀表达式

一笑奈何 提交于 2020-01-19 04:38:38
给定 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, · · · , A(N+M+1). 输出格式: 输出一个整数,代表答案。 输入样例: 1 1 1 2 3 输出样例: 4 数据范围: 对于所有评测用例,0 ≤ N, M ≤ 100000, -10^9 ≤ Ai ≤ 10^9。 解题思路 我们需要讨论负数的个数和 M 的关系: 1、给定的数字本身中负数的个数等于 M,那么显而易见把所有的负数配合负号全部变为正数。 2、给定的数字本身中负数的个数小于 M,这种情况下要分两种小情况进行考虑。 (1)当全部是正数,那么把 M-1 个负号变成正号,减掉最小的数,然后相加其它数。 (2)当既有正数又有负数,那么可以通过转换变成所有数的绝对值相加。 例:输入2 4 -1 -2 -3 4 5 6 7 可以这样组合:4-((-3)-7-2)+5+6 -(-1) 3、给定的数字本身中负数的个数大于 M

前中后缀表达式

拟墨画扇 提交于 2020-01-19 02:29:20
中缀表达式 即算术表达式。如,a+b*c-d/e 后缀表达式 运算符号位于两个运算数之后。如, a b c * + d e /- 前缀表达式 前缀表达式的运算符位于两个相应操作数之前。如,-+*abc/de 用栈实现:特指运算符的入出栈的操作 每次运算符出栈都代表的是一个结果 例题: 1.令P代表入栈,O代表出栈。若利用堆栈将中缀表达式3*2+8/4转为后缀表达式,则相应的堆栈操作序列是: 解: *入栈,然后出栈 +入栈,/入栈,然后分别出栈 PPPOOO 来源: CSDN 作者: Mia@ 链接: https://blog.csdn.net/weixin_43008312/article/details/103788825

前中后缀表达式相关算法

孤者浪人 提交于 2020-01-15 06:05:10
目录 前言 1.判断优先级函数 2.运算函数 3.取运算数、操作数进行运算 一、表达式转换 1.中缀表达式转后缀表达式 2、中缀表达式转前缀表达式 二、表达式求值 1.中缀表达式求值 2.前缀表达式求值 3.后缀表达式求值 前言 1.判断优先级函数 int getPiority(char op){ if(op=='+'||op=='-') return 0; else return 1; } 2.运算函数 //运算函数 int calSub(float opand1,char op,float opand2,float &result){ if(op=='+') result=opand1+opand2; if(op=='-') result=opand1-opand2; if(op=='*') result=opand1*opand2; if(op=='/'){ if(fabs(opand2)<MIN){ return 0; } else { result=opand1/opand2; } } return 1; } 3.取运算数、操作数进行运算 //取运算数、操作数进行运算代码的封装 int calStackTopTwo(float s1[],int &top1,char s2[],int &top2){ float opand1,opand2,result; char op;

前缀、中缀、后缀表达式

守給你的承諾、 提交于 2020-01-13 02:23:09
它们 都 是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式 的运算符位于与其相 关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 一、中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。 中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。 对计算机来说,计算前缀或后缀表达式的值非常简单。 二、前缀表达式(前缀记法、波兰式) 前缀表达式的 运算符位于两个相应操作数之前。 前缀表达式的计算机求值:(相当于转换成了中缀表达式) 从右至左扫描表达式 ,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 例如前缀表达式“- × + 3 4 5 6”: (1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素

前缀、中缀、后缀表达式以及简单计算器的C++实现

两盒软妹~` 提交于 2020-01-12 13:46:24
前缀表达式(波兰表达式)、中缀表达式、后缀表达式(逆波兰表达式) 介绍   三种表达式都是 四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解。 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间。 后缀表达式 后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 中缀表达式转前缀表达式   例如:对于中缀表达式 (3+4)×5-6 ,其前缀表达式为 - × + 3 4 5 6 。前后缀表达式与中缀之间的转换关系,不在此赘述,在 Seraphjin 的博客中,通过二叉树的方式,很好地解释了这一内容。 除了该博客中所说的二叉树法,还可以通过栈方法,来实现二者的转换,具体步骤如下: 初始化两个栈:运算符栈S1和储存中间结果的栈S2; 从右至左扫描中缀表达式; 遇到操作数时,将其压入S2; 遇到运算符时,比较其与S1栈顶运算符的优先级: 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; 否则

中缀表达式转换后缀表达式

别等时光非礼了梦想. 提交于 2019-12-19 05:43:21
记录点滴 转换思路 //中缀表达式转后缀表达式步骤 /** * 小括号()不算运算符优先级, * 1.初始化两个栈,运算符栈s1,和存储中间结果的栈s2, * 2.从左至右扫描中缀表达式 * 3.遇到数时,将其放入栈s2, * 4.遇到运算符时,比较其与s1栈顶运算符的优先级: * 4.1:如果s1为空,或为“(”左括号,直接放入栈s1 * 4.2:否则、若优先级比栈顶元素高,也存入栈s1中, * 4.3:否则,将s1栈顶的元素取出,并存入s2中,再次转到步骤4中,与s1中新的栈顶元素比较 * 5.遇到括号时, * 5.1:如果是左括号“( ” ,则直接存入s1中 * 5.2:如果是右括号“ ) ”,则依次取出s1中的元素,放入s2中,直到遇到左括号“( ”为止 * 6.重复步骤2-5知道遍历到表达式的最右端 * 7.将s1中的符号一次取出 并存入s2 * 8.依次取出s2中的元素,并输出,这时该结果的逆序,就是后缀表达式 */ 2 . 代码 public class PolanNotation { public static void main(String[] args){ String input = "(11+5)*2-6+3"; System.out.println(transition(input)); //输出 后缀表达式 System.out.println

中缀表达式转换为后缀表达式

六月ゝ 毕业季﹏ 提交于 2019-12-14 22:36:52
我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。 中缀表达式“9+(3-1) 3+10/2”转化为后缀表达式“9 3 1-3 + 10 2/+” 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。 下面我们来具体看看这个过程。 初始化一空栈,用来对符号进出栈使用。 第一个字符是数字9,输出9,后面是符号“+”,进栈。 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 - 接着是数字3,输出,总的表达式为9 3 1 - 3 。紧接着是符号“ ”,因为此时的栈顶符号为“+”号,优先级低于“ ”,因此不输出,进栈。 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出

codeup 1918 简单计算器

 ̄綄美尐妖づ 提交于 2019-12-14 03:49:30
思路和坑: step1.中缀表达式变后缀表达式(栈) 解决两个问题,如何处理 数字, 如何处理 操作符。 1.数字直接进入后缀表达式,但是有坑!字符类型的数字在中缀中是可以区分清楚的,例如12+13但是变成后缀1213+,那么字符类型就搞不定了。所以中缀表达式中的元素类型必须为自定义node类型 2.操作符入栈,因为后缀表达式,优先级高的操作符一定在前面,所以,入栈前,需要将比该操作符高的所有操作符都出栈。 step2 计算后缀表达式(用同一个栈就可以搞定) 数字入栈 遇到操作符,让两个数字出栈,计算 》》结果入栈 代码: // 简单计算器3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <stack> #include <cstring> #include <map> #include <cstdio> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct node { double num; char op; bool isNum; }; int

算术表达式转为后缀式

一世执手 提交于 2019-12-09 22:17:49
主要思路:从左到右扫描算术表达式,遇到的操作数直接存放到后缀表达式中,遇到的运算符以及左括号都暂时保存到运算符栈且先执行的运算符先出栈。 前提说明:exp:中缀表达式;postexp:后缀表达式; 算法描述:在扫描exp遇到一个运算符op时, 1、若栈为空,直接进栈 2、若不为空,当op的优先级高于栈顶运算符的优先级时才直接将op进栈,否则依次出栈并存入postexp,直到栈顶运算符的优先级小于op的优先级为止,然后再将op进栈。 3、若op为 ‘(’ ,直接进栈。 4、若op为 ‘)’ ,出栈运算符并存入postexp,直到栈顶为 ‘(’ ,再将 ‘(’ 出栈。 5、若op为其他运算符,而栈顶为 ‘(’ ,直接进栈。 来源: CSDN 作者: temperamentalkj 链接: https://blog.csdn.net/Never_say_die_kj/article/details/103462597