大家帮我 我都要绝望啦!!

大家帮我 我都要绝望啦!! - 故障解答 - 电脑教程网

大家帮我 我都要绝望啦!!

日期:2007-05-07   荐:
大家帮我 我都要绝望啦!!用C语言编了一个利用栈把中缀表达式转换为逆波兰式的程序编译没出错 可是不能输出逆波兰式请指点一下!!#include <stdio.h>#define max 15struct stack{ char change[max]; int top;};int precede(char op){ int x; switch(op) { case '*': x=2; break; case '/': x=2; break; case ' ': x=1; break; case '-': x=1; break; default : x=0; } return x;}void push(struct stack *s,char n){ if((*s).top==max-1) printf("error! overflow!"); (*s).top=(*s).top 1; (*s).change[(*s).top]=n;}char readtop(struct stack *s){ if((*s).top==-1) printf("error! underflow!"); return (*s).change[(*s).top];}char pop(struct stack *s){ char temp; if((*s).top==-1) printf("error! underflow!"); temp=(*s).change[(*s).top]; (*s).top--; return temp;}void transfer(char from[],char to[]){ struct stack s1; int i=0,j=0; char ch; s1.top=-1; push(&s1,'@'); ch=from[i ]; while(ch!='@') { if(ch=='(') { push(&s1,ch); ch=from[i ]; } else if(ch==')') { while(readtop(&s1)!='(') { to[j ]=pop(&s1); } to[j ]=pop(&s1); ch=from[i ]; } else if(ch==' '||ch=='-'||ch=='*'||ch=='/') { char w; w=readtop(&s1); while(precede(w)>=precede(ch)) { to[j ]=pop(&s1); w=readtop(&s1); } push(&s1,ch); ch=from[i ]; } else { while('0'<=ch<='9') { to[j ]=ch;ch=from[i ]; } to[j ]=' '; } } ch=pop(&s1); while(ch!='@') { to[j ]=ch; ch=pop(&s1); } to[j ]='@';}void main(void){ char E[20]; char A[20]; printf("please input an expression with @"); scanf("%s",E); printf("%s",E); transfer(E,A); printf("%s",A); getch();}在函数transfer()中,建议把char ch;改为int ch;因为int类型的范围要比char大,有些符号用char无法表示还有吗???while('0'<=ch<='9')改为 while(ch<='9' && ch>='0')只是大概的看了一下,没有运行如果你的算法思路没有问题的话,你再仔细看看是不是哪些细节上漏掉什么了。可以对你的函数进行单元测试修改后的代码,在vc6下调试通过#include <stdio.h>#include <stdlib.h>#define max 15struct stack{ char change[max]; int top;};int precede(char op){ int x; switch(op) { case '*': x=2; break; case '/': x=2; break; case ' ': x=1; break; case '-': x=1; break; default : x=0; } return x;}void push(struct stack *s,char n){ if((*s).top==max-1) printf("error! overflow!"); (*s).top=(*s).top 1; (*s).change[(*s).top]=n;}char readtop(struct stack *s){ if((*s).top==-1) printf("error! underflow!"); return (*s).change[(*s).top];}char pop(struct stack *s){ char temp; if((*s).top==-1) printf("error! underflow!"); temp=(*s).change[(*s).top]; (*s).top--; return temp;}void transfer(char from[],char to[]){ struct stack s1; int i=0,j=0; char ch; s1.top=-1; push(&s1,'@'); ch=from[i ]; while(ch!='@') { if(ch=='(') { push(&s1,ch); ch=from[i ]; } else if(ch==')') { while(readtop(&s1)!='(') { to[j ]=pop(&s1); } to[j ]=pop(&s1); ch=from[i ]; } else if(ch==' '||ch=='-'||ch=='*'||ch=='/') { char w; w=readtop(&s1); while(precede(w)>=precede(ch)) { to[j ]=pop(&s1); w=readtop(&s1); } push(&s1,ch); ch=from[i ]; } else { while(ch<='9' && ch>='0') { to[j ]=ch;ch=from[i ]; } to[j ]=' '; } } ch=pop(&s1); while(ch!='@') { to[j ]=ch; ch=pop(&s1); } to[j ]='@'; to[j ]='\0';}void main(void){ char E[20]; char A[20]; printf("please input an expression with @"); scanf("%s",E); printf("%s",E); transfer(E,A); printf("%s",A); getchar();}就是transfer函数最后加了一句to[j ]='\0'又改了一个小问题(有括号时输出错误),现在应该正确了#include <stdio.h>#include <stdlib.h>#define max 15struct stack{ char change[max]; int top;};int precede(char op){ int x; switch(op) { case '*': x=2; break; case '/': x=2; break; case ' ': x=1; break; case '-': x=1; break; default : x=0; } return x;}void push(struct stack *s,char n){ if((*s).top==max-1) printf("error! overflow!"); (*s).top=(*s).top 1; (*s).change[(*s).top]=n;}char readtop(struct stack *s){ if((*s).top==-1) printf("error! underflow!"); return (*s).change[(*s).top];}char pop(struct stack *s){ char temp; if((*s).top==-1) printf("error! underflow!"); temp=(*s).change[(*s).top]; (*s).top--; return temp;}void transfer(char from[],char to[]){ struct stack s1; int i=0,j=0; char ch; s1.top=-1; push(&s1,'@'); ch=from[i ]; while(ch!='@') { if(ch=='(') { push(&s1,ch); ch=from[i ]; } else if(ch==')') { while(readtop(&s1)!='(') { to[j ]=pop(&s1); } /* to[j ]=pop(&s1);*/ pop(&s1); ch=from[i ]; } else if(ch==' '||ch=='-'||ch=='*'||ch=='/') { char w; w=readtop(&s1); while(precede(w)>=precede(ch)) { to[j ]=pop(&s1); w=readtop(&s1); } push(&s1,ch); ch=from[i ]; } else { while(ch<='9' && ch>='0') { to[j ]=ch;ch=from[i ]; } to[j ]=' '; } } ch=pop(&s1); while(ch!='@') { to[j ]=ch; ch=pop(&s1); } to[j ]='@'; to[j ]='\0';}void main(void){ char E[20]; char A[20]; printf("please input an expression with @"); scanf("%s",E); printf("%s",E); transfer(E,A); printf("%s",A); getchar();}stdlib.h 是什么头文件啊另外 在transfer函数里的 else if(ch==')') { while(readtop(&s1)!='(') { to[j ]=pop(&s1); } /* to[j ]=pop(&s1);*/ pop(&s1); ch=from[i ]; }加了一个pop(&s1); pop();在定义的时候就有删除栈顶元素的功能啊 再加一个是 什么意思啊 另外pop();是有返回值的 直接调用可以吗??/什么是中缀表达式,逆波兰式?另外pop();是有返回值的 ===========================可以直接调用,这里是为了去掉那个多余的左括号stdlib.h 是什么头文件啊============================这个里面包含了getchar的定义谢谢 呵呵!!!
标签: