#include <stdio.h> int k=0,n=0; int row,col; char priority[7][7]={ '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=', }; /*简单的带括号的计算器,即输入一串表达式,求值*/ int In(char c,char *p){ int i; for(i=0;i<7;i++) if(c==p[i]) return 1; else return 0; }/*判断c是否为运算符*/ void push(char *p,char c){ p[k]=c; k++; } void pop(char *p,char *c){ k--; *c=p[k]; } void pushd(int *q,int a){ q[n]=a; n++; } void popd(int*q,int *a) { n--; *a=q[n]; } char gettop(char *p,int g){ return p[g--]; } int gettopd(int *q,int l){ return q[l--]; } int detect(char c){ int i; char op[7]={'+','-','*','/','(',')','#'}; for(i=0;i<7;i++){ if(c=op[i]) return i; } } char precede(char c,char f){ row=detect(c); col=detect(f); return priority[row][col]; } int operate(int e,char theta,int b){ switch(theta){ case'+': return (e+b);break; case'-': return (e-b);break; case'*': return (e*b);break; case'/': return (e/b);break; } } int main(){ int a=0,b,e,j=0,h;char c,f,x,theta; char C[20];push(C,'#');/*符号栈*/ char d[20];/*暂时存储字符,再转换成十进制数存入 栈D中*/ int D[20]; c=getchar();/*数据栈*/ char OP[7]={'+','-','*','/','(',')','#'}; while(c!='#'||gettop(C,k)!='#'){ if(!In(c,OP)){d[j++]=c;c=getchar();}/*判断是否在符号数组内,不在则用d数组存起来,为后来转变十进制用*/ else { for(h=0;h<j;h++) a=a*10+(d[h]-'0'); pushd(D,a);/*转化为十进制入栈*/ printf("%d\n",a); /*感觉这里有问题 加了这一句检测,发现这个while及 switch段有问题 ,不停地打印a=0*/ j=0;a=0; switch(precede(gettop(C,k),c)){ case '<': printf("%c\n",c);push(C,c);c=getchar();break; case '=': pop(C,&x); c=getchar();break; case '>': pop(C,&theta); popd(D,&b);popd(D,&e); pushd(D,operate(e,theta,b)); break; default : break; } } } a=gettopd(D,n); printf("%d\n",a); getchar(); } |
[技术| 编程·课件·Linux] 实在找不到错,但结果显示是while循环里有问题。谁有时 ...
镕羽
· 发布于 2012-08-19 16:54
· 2237 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。