后缀表达式
2015-10-16 09:07
316 查看
#include <stdio.h>#include "sqstack.h"#define MaxOp 7struct //设定运算符优先级{char ch; //运算符int pri; //优先级}lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};int leftpri(char op) //求左运算符op的优先级{int i;for (i=0; i<MaxOp; i++)if (lpri[i].ch==op)return lpri[i].pri;}int rightpri(char op) //求右运算符op的优先级{int i;for (i=0; i<MaxOp; i++)if (rpri[i].ch==op)return rpri[i].pri;}bool InOp(char ch) //判断ch是否为运算符{if (ch=='(' || ch==')' || ch=='+' || ch=='-'|| ch=='*' || ch=='/')return true;elsereturn false;}int Precede(char op1,char op2) //op1和op2运算符优先级的比较结果{if (leftpri(op1)==rightpri(op2))return 0;else if (leftpri(op1)<rightpri(op2))return -1;elsereturn 1;}void trans(char *exp,char postexp[])//将算术表达式exp转换成后缀表达式postexp{SqStack *opstack; //定义运算符栈int i=0; //i作为postexp的下标ElemType ch;InitStack(opstack); //用初始化栈运算为栈分配空间,务必要做Push(opstack, '=');while (*exp!='\0') //exp表达式未扫描完时循环{if (!InOp(*exp)) //为数字字符的情况{while (*exp>='0' && *exp<='9') //判定为数字{postexp[i++]=*exp;exp++;}postexp[i++]='#'; //用#标识一个数值串结束}else //为运算符的情况{GetTop(opstack, ch); //取得栈顶的运算符switch(Precede(ch ,*exp)){case -1: //栈顶运算符的优先级低:进栈Push(opstack, *exp);exp++; //继续扫描其他字符break;case 0: //只有括号满足这种情况Pop(opstack, ch); //将(退栈exp++; //继续扫描其他字符break;case 1: //退栈并输出到postexp中postexp[i++]=ch;Pop(opstack, ch);break;}}} //while (*exp!='\0')Pop(opstack, ch);while (ch!='=')//此时exp扫描完毕,退栈到'='为止{postexp[i++]=ch;Pop(opstack, ch);}postexp[i]='\0'; //给postexp表达式添加结束标识DestroyStack(opstack);}int main(){char exp[]="(56-20)/(4+2)"; //可将exp改为键盘输入char postexp[200];trans(exp,postexp);printf("中缀表达式:%s\n",exp);printf("后缀表达式:%s\n",postexp);return 0;}
相关文章推荐
- 第7周项目4 - 队列数组
- 第七周项目2—建立链队算法库
- 整理 iOS 9 适配中出现的坑(图文)
- Lucene简介
- Lucene_demo05_内存索引和文件索引
- 在Ubuntu下配置pyrouge
- Android实战简易教程<六十五>(自定义控件实现数字液晶时钟Demo)
- 初步解析Java中AffineTransform类的使用
- Logstash处理json格式日志文件的三种方法
- Lucene_demo04_分页
- Lucene_demo03_索引库整理
- 分布式服务框架的4项特性
- 常见的YUV码流格式
- Android Studio 项目结构解析
- 第七周项目1--建立顺序环形队列算法库
- Host文件初识
- 第7周 项目4 - 队列数组
- Cg two-sided per-vertex lighting
- spi总线
- Kruskal算法求最小生成树