2015年大二上-数据结构-栈(5)- 后缀表达式
来源:互联网 发布:网络公益联盟 编辑:程序博客网 时间:2024/06/05 06:26
利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#。
/**Copyright (c) 2014,烟台大学计算机学院*All rights reserved.*文件名称:Annpion.cpp*作者:王耀鹏*完成日期:2015年11月14日*版本号:v1.0**问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#。*输入描述:输入一个表达式。*输出描述:输出中缀表达式对应的后缀表达式,并输出所得的值。*/#include <stdio.h>#include <malloc.h>#include "SqStack.h"#define MaxOp 7#define MaxSize 100struct{ char ch; int pri;}lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};int rightpri(char op){ for(int i=0; i<MaxOp; ++i) if(rpri[i].ch==op) return rpri[i].pri;}int leftpri(char op){ for(int i=0; i<MaxOp; ++i) if(lpri[i].ch==op) return lpri[i].pri;}int Precede(char op1,char op2){ if(leftpri(op1)>rightpri(op2)) return 1; else if(leftpri(op1)<rightpri(op2)) return -1; else return 0;}bool InOp(char op){ if(op=='('||op==')'||op=='+'||op=='-'||op=='*'||op=='/') return true; else return false;}void trans(char *exp,char postexp[]){ char ch; int i=0; SqStack *OpStack; OpStack=(SqStack *)malloc(sizeof(SqStack)); InitStack(OpStack); Push(OpStack,'='); while(*exp!='\0') { 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: Pop(OpStack,ch); postexp[i++]=ch; break; } } } Pop(OpStack,ch); while(ch!='=') { postexp[i++]=ch; Pop(OpStack,ch); } postexp[i++]='\0'; DestroyStack(OpStack);}double Calculate(char *postexp){ struct calculate { double data[MaxSize]; int top; }; calculate *Cal; Cal=(calculate *)malloc(sizeof(calculate)); Cal->top=-1; while(*postexp!='\0') { if(!InOp(*postexp)) { double d=0; while(*postexp!='#') { d=d*10+*postexp-'0'; ++postexp; } ++Cal->top; Cal->data[Cal->top]=d; } else { switch(*postexp) { case '+': Cal->data[Cal->top-1]=Cal->data[Cal->top-1]+Cal->data[Cal->top]; --Cal->top; break; case '-': Cal->data[Cal->top-1]=Cal->data[Cal->top-1]-Cal->data[Cal->top]; --Cal->top; break; case '*': Cal->data[Cal->top-1]=Cal->data[Cal->top-1]*Cal->data[Cal->top]; --Cal->top; break; case '/': Cal->data[Cal->top-1]=Cal->data[Cal->top-1]/Cal->data[Cal->top]; --Cal->top; break; } } ++postexp; } return Cal->data[Cal->top];}int main(){ char exp[]="(56-20)/(4+2)"; //可将exp改为键盘输入 char postexp[200]; trans(exp,postexp); printf("中缀表达式:%s\n",exp); printf("后缀表达式:%s\n",postexp); printf("表达式的值:%g",Calculate(postexp)); return 0;}
运行结果:
0 0
- 2015年大二上-数据结构-栈(5)- 后缀表达式
- 2015年大二上-数据结构-栈(4)- 数制转换
- 2015年大二上-数据结构-队列(5)- 队列数组
- 2015年大二上-数据结构-图-2-(5)-拓扑排序
- 2015年大二上-数据结构-顺序表(2)-奇右偶左
- 2015年大二上-数据结构-链表(1)-建立单链表
- 2015年大二上-数据结构-链表(3)-单链表算法
- 2015年大二上-数据结构-链表(7)-多项式求和
- 2015年大二上-数据结构-队列(4)- 队列数组
- 2015年大二上-数据结构-队列(6)- 停车场模拟
- 2015年大二上-数据结构-串(4)- 字符串加密
- 2015年大二上-数据结构-栈(1)-顺序栈算法库
- 2015年大二上-数据结构-栈(2)-链栈算法库
- 2015年大二上-数据结构-栈(3)- 括号的匹配
- 2015年大二上-数据结构-链表(5)-猴子选大王
- 2015年大二上-数据结构-串(5)- 计数的模式匹配
- 2015年大二上-数据结构-图-2-(1)-Prim算法
- 2015年大二上-数据结构-图-2-(2)-Kruskal算法
- Codeforces 594A - Warrior and Archer (思维)
- ps快捷键对应的英文字母缩写
- Java中 对象克隆实例
- [NOIP2015]推销员
- HDOJ 1075 What are you talking about ? 字典树
- 2015年大二上-数据结构-栈(5)- 后缀表达式
- STS怎么创建一个springMVC的Maven项目
- linux 修改 机器名 root@localhost
- Hibernate检索方式的学习2015-11-14
- Understanding glibc malloc
- VM虚拟机快速安装LAMP后的配置
- Bochs调试指令
- 数据仓库与数据库的区别
- c++开源日志库log4cplus