#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();
    }


共收到 15 条回复
simon3322 · #2 · 2012-8-19 18:12:36  回复 支持 反对
看不下去了...一跑全是0啊...

点评

是啊 while 那里有问题 找不出来  详情 回复 发表于 2012-8-19 18:24
镕羽 · #3 · 2012-8-19 18:24:51  回复 支持 反对
simon3322 发表于 2012-8-19 18:12
看不下去了...一跑全是0啊...

是啊  while 那里有问题  找不出来

点评

查出来了,你gettop返回的char不对~  详情 回复 发表于 2012-8-19 19:19
查出来了,你gettop返回的char不对~  详情 回复 发表于 2012-8-19 19:19
看不出来具体有哪些问题,不过发现一些小问题了  详情 回复 发表于 2012-8-19 19:05
xw007110 · #4 · 2012-8-19 18:54:52  回复 支持 反对
刚才我帮你DeBug了一下,用的是1+2#这个运算。发现那个小c变量一直都是‘+’变量,没改变。你的很多变量没有初始化,我看到各种乱码,而且你的堆栈操作都没进行检查,所以导致错误没有分析出来。我没看你的程序逻辑,所以就不帮你查错误在哪了。有问题再问

点评

好 谢谢 这是参照严蔚敏的伪代码改的  详情 回复 发表于 2012-8-19 19:23

评分

参与人数 1学分 +5 收起 理由
jose + 5 积极解答同学问题!很热心!加分!

查看全部评分

foolisheep · #5 · 2012-8-19 19:02:12  回复 支持 反对
我表示我的计算器写了四百多行啊……你的这么精炼……

点评

参照的严蔚敏书上的代码  详情 回复 发表于 2012-8-19 19:22
simon3322 · #6 · 2012-8-19 19:05:53  回复 支持 反对
镕羽 发表于 2012-8-19 18:24
是啊  while 那里有问题  找不出来

看不出来具体有哪些问题,不过发现一些小问题了
simon3322 · #7 · 2012-8-19 19:19:38  回复 支持 反对
镕羽 发表于 2012-8-19 18:24
是啊  while 那里有问题  找不出来

查出来了,你gettop返回的char不对~
simon3322 · #8 · 2012-8-19 19:19:41  回复 支持 反对
镕羽 发表于 2012-8-19 18:24
是啊  while 那里有问题  找不出来

查出来了,你gettop返回的char不对~

点评

该怎么弄?  详情 回复 发表于 2012-8-19 19:22
镕羽 · #9 · 2012-8-19 19:22:25  回复 支持 反对
foolisheep 发表于 2012-8-19 19:02
我表示我的计算器写了四百多行啊……你的这么精炼……

参照的严蔚敏书上的代码
镕羽 · #10 · 2012-8-19 19:22:41  回复 支持 反对
simon3322 发表于 2012-8-19 19:19
查出来了,你gettop返回的char不对~

该怎么弄?

点评

k值始终不对,gettop实现的问题吧?  详情 回复 发表于 2012-8-19 19:25
镕羽 · #11 · 2012-8-19 19:23:32  回复 支持 反对
xw007110 发表于 2012-8-19 18:54
刚才我帮你DeBug了一下,用的是1+2#这个运算。发现那个小c变量一直都是‘+’变量,没改变。你的很多变量没有 ...

好 谢谢  这是参照严蔚敏的伪代码改的
simon3322 · #12 · 2012-8-19 19:25:47  回复 支持 反对
镕羽 发表于 2012-8-19 19:22
该怎么弄?

k值始终不对,gettop实现的问题吧?
jose · #13 · 2012-8-19 20:12:50  回复 支持 反对
掌握正确的调试技巧很重要,加油
wkmatt · #14 · 2012-8-22 23:44:03  回复 支持 反对
只看到主函数开头!发现你的得到栈顶数据的两个函数不正确!你的k是栈顶的上一个!所以gettop中应return p[--g],gettopd也是如此!来自: Android客户端

点评

嗯 谢谢 回头试试~~  详情 回复 发表于 2012-9-5 17:49
镕羽 · #15 · 2012-9-5 17:49:42  回复 支持 反对
wkmatt 发表于 2012-8-22 23:44
只看到主函数开头!发现你的得到栈顶数据的两个函数不正确!你的k是栈顶的上一个!所以gettop中应return p[ ...

嗯 谢谢 回头试试~~
poiu9080 · #16 · 2012-9-5 19:09:07  回复 支持 反对
所以为什么要用
--g
而不用
g-1
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表