NYOJ 467 中缀式变后缀式
2012-08-06 17:16
211 查看
#include<stdio.h> #include<stdlib.h> #define Stack_Size 100 #define StackIncrement 10 #define Ok 1 #define Error 0 #define True 1 #define False 0 #define Overflow -2 typedef int status; //字符栈的操作 typedef struct { char *base; char *top; int stacksize; }SqStack; status InitStack(SqStack &S) { S.base=(char *)malloc(Stack_Size*sizeof(char)); if(!S.base) exit(Overflow); S.top=S.base; S.stacksize=Stack_Size; return Ok; } status StackEmpty(SqStack &S) { if(S.top==S.base) return True; return False; } status GetTop(SqStack S,char &e) { if(S.top==S.base) return Error; e=*(S.top-1); return Ok; } status Push(SqStack &S,char e) { if((S.top-S.base)==S.stacksize) { S.base=(char *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char)); if(!S.base) exit(Overflow); S.top=S.base+S.stacksize; S.stacksize+=StackIncrement; } *S.top++=e; return Ok; } status Pop(SqStack &S,char &e) { if(S.top==S.base) return Error; e=*--S.top; return Ok; } //转化的操作过程 static int i=0; status Pass(char *s,char c) { s[i]=c; i++; return Ok; } status In(char c) { switch(c) { case '+': case '-': case '*': case '/': case '(': case ')': case '=':return True; default :return False; } } int Precede(char t1,char t2) { int f=0; switch(t1) { case '+': case '-':if(!(t2=='('||t2=='*'||t2=='/')) f=1; break; case '*': case '/':if(t2!='(') f=1; break; case '(':if(t2=='#') {printf("缺乏左括号\n"); exit(Overflow);} break; case ')':if(t2!='(') f=1; else { printf("括号不匹配\n"); exit(Overflow); } } return f; } status Converse(char *s) { SqStack OPTR; char ch,x,c=getchar(); InitStack(OPTR); Push(OPTR,'='); while(!StackEmpty(OPTR)) { if(!In(c)) Pass(s,c); else switch(c) { case '(': Push(OPTR,c);break; case ')': Pop(OPTR,ch);while(ch!='('){Pass(s,ch);Pop(OPTR,ch);}break; default : while(GetTop(OPTR,ch)&&Precede(ch,c)) { Pass(s,ch);Pop(OPTR,ch); } if(c!='=') Push(OPTR,c); } if(c!='=') { x=c;c=getchar(); if(!In(x)&&In(c)) Pass(s,' '); } else { Pop(OPTR,ch); Pass(s,ch); } } s[i]='\0'; return Ok; } //主函数 int main() { char s[1010]; int j,n; scanf("%d",&n); while(n--){ getchar(); i=0; Converse(s); for(j=0;s[j];++j){ putchar(s[j]); if(In(s[j])) putchar(' '); } printf("\n"); } system("pause"); return 0; }
相关文章推荐
- NYOJ467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ-467-中缀式变后缀式(模拟)
- NYOJ_467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式
- nyoj467 中缀式变后缀式
- NYOJ-467 中缀式变后缀式
- NYOJ 467 中缀式变后缀式(栈)
- nyoj 467 中缀式变后缀式
- nyoj 题目467 中缀式变后缀式
- NYOJ - 中缀式变后缀式(逆波兰式)
- nyoj 467(表达式求值)
- Nyoj467【中缀转后缀】
- nyoj-257-郁闷的C小加(一 )中缀式变后缀式