后缀表达式怎么计算(后缀表达式题目)

前缀、中缀、后缀表达式是怎样的?

(1)表达式的三种形式:

中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3;

后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:21+3*;

前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:*+213。

(2)表达式的计算:

由于后缀表达式中没有括号,不需判别优先级,计算严格从左向右进行,故计算一个后缀表达式要比计算机一个中缀表达式简单得多。

将中缀表达式转换为后缀表达式的算法思想:

·当读到数字直接送至输出队列中

·当读到运算符t时,

a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;

b.t进栈

·读到左括号时总是将它压入栈中

·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。

运用后缀表达式进行计算的具体做法:

·建立一个栈s

·从左到右读后缀表达式,读到数字就将它转换为数值压入栈s中,读到运算符则从栈中依次弹出两个数分别到y和x,然后以“x运算符y”的形式计算机出结果,再压加栈s中

·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束

中缀表达式A+(B-CD)*E 转换成后缀表达式,并写出详细过程(包括()+ – * 的优先级)!

  • ABCD-E*+

将一个中缀表达式转换为一个后缀表达式,用栈的方法,能显示,输入之后就死循环了

  • #include "stdafx.h"#include stdio.h#includestdlib.htypedef struct node{ int num; char cha; struct node *next;}stack;敞甫搬晃植浩邦彤鲍廓int judge(char c, char c1)c将要进栈,c1栈顶符号{ int temp1 = 2, temp2 = 2; switch (c) { case +: case -:temp1 = 1;break; default: break; } switch (c1) { case +: case -:temp2 = 1;break; default: break; } if (temp1 temp2)return 1; return 0;}int IsEmpty(stack *head){ if (head-num == NULL&&head-num == NULL)return 0; return 1;}stack *MakeHead(stack *head){ head = (stack*)malloc(sizeof(stack)); head-cha = NULL; head-num = NULL; head-next = NULL; return head;}stack *InS_Stack(stack *s_stack, int k){ stack *p; p = (stack*)malloc(sizeof(stack)); p-cha = NULL; p-num = k; p-next = s_stack-next; s_stack-next = p; return s_stack;}stack *InC_Stack(stack *s_stack, char c){ stack *p; p = (stack*)malloc(sizeof(stack)); p-cha = c; p-num = NULL; p-next = s_stack-next; s_stack-next = p; return s_stack;}stack* Out_stack(stack* s_stack){ stack *p; p = s_stack-next; free(s_stack-next); s_stack = p-next; return s_stack;}int main(){ int i = 0, m = 0, k = 0, f = 0; char temp; char c[100]; stack *s_stack, *p, *s_stack1; s_stack = (stack*)malloc(sizeof(stack)); s_stack1 = (stack*)malloc(sizeof(stack)); s_stack = MakeHead(s_stack); s_stack1 = MakeHead(s_stack1); printf("请输入算式,=结束:n"); while (1) { scanf_s("%c", c[i]); i++; } i = 0; while (1) { if (c[i] == =) break; if (c[i] = 0&&c[i] = 9) { m = 10 * m + c[i]; k = m; } else { if (c[i – 1] = 0&&c[i – 1] = 9) { s_stack = InS_Stack(s_stack, k); } if (c[i] == + || c[i] == – || c[i] == * || c[i] == ) { p = s_stack-next; while (p) { if (p-cha) { temp = p-cha; f = judge(c[i], temp); if (!f) s_stack = InC_Stack(s_stack, c[i]); else { while (s_stack-next-cha&&judge(c[i], s_stack-next-cha)) { if (s_stack-next-cha) InC_Stack(s_stack1, s_stack-next-cha); else InS_Stack(s_stack1, s_stack-next-num); s_stack = Out_stack(s_
  • 你代码写成这样大大降低了可读性,没有人愿意看

如何用js实现中缀表达式转后缀表达式然后求值

  • 在计算机上用的 1、利用栈来实现 2、利用语法树来实现 先把中缀表达式用二叉树表示出来,发础篡飞诂读磋嫂单讥再后序遍历该二叉树就得到相应的后缀表达式了 在草稿上手工转换 3、加括号法

中缀表达式转为后缀表达式并求值

  • 在计算机上用的 1、利用栈来实现 2、利用语法树来实现 先把中缀表达式用二叉树表示出来,再后序遍历该二叉树就得迹鸡管课攮酒归旬害莫到相应的后缀表达式了 在草稿上手工转换 3、加括号法

利用堆栈实现 (a-(b*c+f)*E)(F+g)转换为后缀表达式abc*f+E*-Fg+?

  • #includeiostream#includestdlib.h#includestdio.husing namespace std; typedef struct stack{ char arr[100]; int top;}stack,*Pstack; void init(Pstack t){ t-top=-1;} int isempty(Pstack t){//栈为空返回1 if(t-top==-1) return 1; else return 0;} void push(Pstack t,char x){ t-arr[++t-top]=x; } char pop(Pstack t){ if(t-top==-1) return -1;//栈为空,返回-1 else return t-arr[t-top–];} char gettop(Pstack t){ if(t-top==-1) return -1;//栈为空,返回-1 else return t-arr[t-top];} int pro(char c){//定义优先级 switch(c){ case (:return 0;break; case +: case -:return 1;break; case *: case /:return 2;break; case ):return 3;break; }} int cmp(char a,char b){ if(pro(a)=pro(b)) return 1;//栈顶元素的优先级高于或等于待判断的元素时,弹出栈顶元素 else return 0;} int isletter(char c){ if(c=A&&c=z) return 1; else return 0;} int main(){ char c; char p,q; Pstack t=(Pstack)malloc(sizeof(stack)); init(t); c=getchar(); while(c!=n){ if(isletter(c)) coutc"";//若为操作数,直接输出 else{ switch(c){ case (:push(t,();break;//直接入栈 case ):if(gettop(t)!=() coutpop(t);//清空括号之间的内容 pop(t); break; default: p=gettop(t); if(cmp(p,c)==1) { coutpop(t); push(t,c); } else push(t,c); } } c=getchar(); } while(!isempty(t)) coutpop(t);//当栈中还有元素时,也要输出 coutendl; } 请问为什么这个输出出来有点小问题
  • #includeiostream#includestdlib.h#

只有加法减法的运算式如何转化为后缀表达式

  • 比如 1+2-3+4-5+6 这样的式子,因为运算符都是加或者减,最后的后缀表达式是 1 2 3 4 5 6 + – + – + 吗,但是计算出来的结果就不对了
  • 还在计算机技术

只有加法减法的运算式如何转化为后缀表达式

  • 比如 1+2-3+4-5+6 这样的式子,因为运算符都是加或者减,最后的后缀表达式是 1 2 3 4 5 6 + – + – + 吗,但是计算出来的结果就不对了
  • 还在计算机技术

中缀表达式(a-b)*(c+d)的后缀表达式是_____. A.ab-*cd+ B.a-bc+d* C.ab-cd*+ D.ab-cd+*

  • 中缀表达式(a-b)*(c+d)的后缀表达式是_____.A.ab-*cd+B.a-bc+d*C.ab-cd*+D.ab-cd+*
  • (a-b)×(c+d)=ac+ad-bc-bd的后缀表达式是ab-cd+*选D

为您推荐