Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
Hint
Author
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; typedef char selemtype; typedef int status; #define stackmax 10000 #define stacknum 10 #define true 1 #define error 0 typedef struct { selemtype *base; selemtype *top; int stacksize; } sqstack; int initstack(sqstack &S) { S.base=new selemtype[stackmax]; S.top=S.base; S.stacksize=stackmax; return 1; } int push(sqstack &S, selemtype e) { if(S.top-S.base>=stackmax) { S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum) * sizeof(selemtype)); S.top=S.base+S.stacksize; S.stacksize+=stacknum; } *S.top++=e; return 1; } int pop(sqstack &S, selemtype &e) { if(S.top==S.base) return 0; e=*--S.top; return 1; } status stackempty(sqstack &S) { if(S.base==S.top) return true; else return false; } int compare(char a) { if(a=='*'||a=='/') return 2; else if(a=='+'||a=='-') return 1; else if(a=='(') return 3; else if(a==')') return 4; return 0; } int main() { sqstack S; initstack(S); selemtype e; char exp[1000]; int i=0,a=0; char s[1000]; while(~scanf("%c",&s[i])&&s[i]!='#') { if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')) { exp[a++]=s[i]; } else { if(stackempty(S)) { push(S,s[i]); } else if(compare(s[i])>compare(*(S.top-1))) { if(compare(s[i])==4) { while(*(S.top-1)!='(') { exp[a++]=*(S.top-1); pop(S,e); } pop(S,e); } else { push(S,s[i]); } } else { if(*(S.top-1)!='(') { exp[a++]=*(S.top-1); pop(S,e); push(S,s[i]); } else push(S,s[i]); } } i++; } while((!stackempty(S))) { exp[a++]=*(S.top-1); pop(S,e); } for(i=0; i<strlen(exp); i++) { cout<<exp[i]; } printf("\n"); return 0; }