逆波兰表达式
来源:互联网 发布:linux退出vi编辑命令 编辑:程序博客网 时间:2024/05/22 03:20
逆波兰表达式,也叫后缀表达式,比如,表达式”(56-20)/(4+2)”的逆波兰表达式为“56 20 - 4 2 + /”。将算术表达式用一颗二叉树表示,然后后序遍历该二叉树,即可得到它的逆波兰表达式。如图(1)所示:
可以用栈将算法表达式转化为逆波兰式,代码如下:
#include <stdio.h>#define MaxSize 100//符号栈struct{ char data[MaxSize]; int top;}op;//数值栈struct{ float data[MaxSize]; int top;}st;//将算术表达式exp转换为后缀表达式postexpvoid trans(char exp[],char postexp[]){ char ch; int i=0,j=0; //i扫描exp的下标,j扫描postexp的下标 op.top=-1; ch=exp[i]; i++; while (ch != '\0') { switch(ch){ case '(': //左括号 op.top++; op.data[op.top]=ch; break; case ')': //右括号 while(op.data[op.top]!='(') { postexp[j]=op.data[op.top]; j++; op.top--; } op.top--; break; case '+': //为'+'或'-'时,其优先级不大于栈顶任何运算符的优先级,直到')' case '-': while (op.top!=-1 && op.data[op.top]!='(') { postexp[j]=op.data[op.top]; j++; op.top--; } op.top++; op.data[op.top]=ch; break; case '*': case '/': //为'*'或'/'时,其优先级不大于栈顶为'*'或'/'的优先级,直到')' while(op.top!=-1 && op.data[op.top]!='(' && (op.data[op.top]=='*' || op.data[op.top]=='/')){ postexp[j]=op.data[op.top]; j++; op.top--; } op.top++; op.data[op.top]=ch; break; case ' ': break; //过滤空格 default: while (ch>='0' && ch<='9') { postexp[j]=ch; j++; ch=exp[i]; i++; } i--; //postexp[j]='#'; j++; postexp[j]=' '; j++; //用空格标识一个数值串结束 } ch=exp[i]; i++; } while(op.top!=-1){ //此时,exp扫描完毕,栈不空时出栈并存放到postexp中 postexp[j]=op.data[op.top]; j++; op.top--; } postexp[j]='\0'; //给postexp表达式添加结束标识}void main(){ char exp[20]="(56-20)/(4-2)"; char postexp[30]; //求exp的逆波兰式 trans(exp,postexp); printf("表达式 %s 逆波兰式如下:\n",exp); printf("%s\n",postexp);}
效果如下:
0 0
- 波兰、逆波兰表达式
- 波兰表达式和逆波兰表达式
- 波兰表达式和逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式rpn
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式实验
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- 逆波兰表达式
- MockITO学习总结
- docker运行graphite
- 黑马程序员——OC语言基础---类和对象
- 字符串全排列和组合问题
- 单链表
- 逆波兰表达式
- scala中用implicit实现依赖注入
- android开发步步为营之80:android多线程总结
- 类型进阶
- js函数对象的总结
- (2)Java开发和运行环境的搭建详解
- [kuangbin带你飞]数论基础的简单题解
- 第4周项目4- 建设双链表算法库
- 文件代码模板的使用