一般表达式转化为后缀式

来源:互联网 发布:硕鼠官网mac 编辑:程序博客网 时间:2024/04/29 04:32
数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
# include <stdio.h># include <stdlib.h># define STACK_INIT_SIZE 100# define STACKINCREMENT 10typedef char SelemType;typedef struct{SelemType *base;SelemType *top;int stacksize;} SqStack;void InitStack(SqStack&S);void Push(SqStack&S,SelemType e);void Pop(SqStack&S,SelemType&e);bool StackEmpty(SqStack&S);void GetTop(SqStack&S,SelemType&e);int prority(char op);// 定义相关操作符的优先级/* 中缀转后缀  栈用来存操作符*/int main(){int i=0;char etop,epop;SqStack S;InitStack(S);    char str[100];gets(str);while(str[i]!='#'){    //字母直接输出if('a'<=str[i] && str[i]<='z')printf("%c",str[i]);else{    // 栈空进栈if(StackEmpty(S))Push(S,str[i]);else{GetTop(S,etop);                   //      prority(str[i])      pority(etop)if(prority(str[i]) >= prority(etop))   // 1 )                 (  */    + -{                                     //  2 (                    */    + -    // 是')'将栈中'('之上的操作符输出//   3 */                         + -if(prority(str[i]) == 4)        //    4 +/                         + -{while(etop!='('){Pop(S,epop);printf("%c",epop);GetTop(S,etop);}Pop(S,epop);//弹出'('}else{Push(S,str[i]);}}                                   //      prority(str[i])      pority(etop)else                               //   5   + -                     */  ({                                  //  6   */                         (if(etop!='('){Pop(S,epop);printf("%c",epop);Push(S,str[i]);}else{Push(S,str[i]);}}}}i++;}GetTop(S,etop);while(!StackEmpty(S)){printf("%c",etop);Pop(S,epop);GetTop(S,etop);}return 0;}void InitStack(SqStack&S){S.base = (SelemType*)malloc(STACK_INIT_SIZE*sizeof(SelemType));if(!S.base){exit(0);}S.top = S.base;S.stacksize = STACK_INIT_SIZE;}void Push(SqStack&S,SelemType e){if(S.top - S.base >= S.stacksize){S.base = (SelemType*)realloc(S.base,(STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SelemType));if(!S.base){exit(0);}S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = e;S.top++; //*S.top++ = e;}void Pop(SqStack&S,SelemType&e){if(S.top == S.base)return;else{//e = *--S.top;S.top--;e = *S.top;}}bool StackEmpty(SqStack&S){if(S.top == S.base)return true;elsereturn false;}void GetTop(SqStack&S,SelemType&e){if(S.top == S.base)return;elsee = *(S.top-1);}int prority(char c){if(c == '+' || c == '-')return 1;if(c == '*' || c == '/')return 2;if(c == '(')return 3;if(c == ')')return 4;}



0 0
原创粉丝点击