none
二级指针,栈 RRS feed

  • 问题

  • 一个简单的计算器程序,逆波兰式   我知道哪里不对,在入栈初那里,我做了标记,但不知道怎么改。请同志们指点指点

    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    #include "ctype.h"
    #define Max 1000
    #define Increase 10

    typedef struct{
     double *base;
     int top;}Stack;

    void Init(Stack *S);//构建一个空栈
    void Push(Stack *S,double number);//数据入栈
    void Pop(Stack *S,double *p);//数据出栈

    int main()
    {
     Stack *S,stack;
     double *p,*q,number1,number2;
     char **argv,*value[6] = {"livf","2","3","4","+","*"};

     argv = value;
     p = &number1;
     q = &number2;
     S = &stack;
     Init(S);
     while(argv++)
     {
      int i,j,c,power,sign;
      double temp;

      j = 0;
      power = 1;
      sign = 1;
      temp = 0;
      for(; *(*argv + j) != '\0';)
      {
       if (isdigit(c = *(*argv + j)))
       {
        for(i = 0; *(*argv + i) >= '0' && *(*argv + i) <= '9'; i ++)
        {
         temp = 10.0 * temp + *(*argv + i) - '0';
        }
        if (*(*argv + i) == '.')
        {
         i ++;
         for(; *(*argv + i) >= '0' && *(*argv + i) <= '9'; i ++)
         {
          temp =10.0 * temp + *(*argv + i) - '0';
          power *= 10;
         }
        }
        Push(S,temp / power);//问题在此,为什么无法入栈,除第一次外
        j = i;
       }
       else
       {
        switch(c)
        {
        case '+':
         Pop(S,p);
         Pop(S,q);
         Push(S,*p + *q);
         j ++;
         break;
        case '-':
         if (*(*argv + 1) != '\0')
         {
          sign = -1;
          for(i = 1; *(*argv + i) >= '0' && *(*argv + i) <= '9'; i ++)
          {
           temp =10.0 * temp + *(*argv + i) - '0';
          }
          if (*(*argv + i) == '.')
          {
           i ++;
           for(; *(*argv + i) >= '0' && *(*argv + i) <= '9'; i ++)
           {
            temp =10.0 * temp + *(*argv + i) - '0';
            power *= 10;
           }
          }
          j = i;
          temp = -temp;
          Push(S,temp / power);
          break;
         }
         Pop(S,p);
         Pop(S,q);
         Push(S,*q - *p);
         j ++;
         break;
        case '*':
         Pop(S,p);
         Pop(S,q);
         Push(S,*p * *q);
         j ++;
         break;
        case '/':
         Pop(S,p);
         if (*p == 0)
         {
          printf("Error:Divide cannot be zero!\n");
          return -1;
         }
         else
         {
          Pop(S,q);
          Push(S,*q / *p);
         }
         j ++;
         break;
        case '%':
         Pop(S,p);
         if (*p == 0)
         {
          printf("Error:Divide cannot be zero!\n");
          return -1;
         }
         else
         {
          Pop(S,q);
          Push(S,fmod(*q,*p));
         }
         j ++;
         break;
        default:
         printf("Error:Illegal opreation!\n");
         return -1;
        }
       }
      }
     }
     Pop(S,p);
     printf("%f\n",*p);
     return 1;
    }
    void Init(Stack *S) //构建一个空栈
    {
     S->base = (double *)malloc(Max * sizeof(double));
     S->top = -1;
    }
    void Push(Stack *S,double number)//数据入栈
    {
     if (S->top + 1 >= Max)
     {
      double *newbase;
      newbase = (double *)realloc(S->base,(Max + Increase) * sizeof(double));
      S->base = newbase;
     }
     S->base[++ S->top] = number;
    }
    void Pop(Stack *S,double *p)//数据出栈
    {
     if (S->top < 0)
     {
      printf("Error:Illegal opreation,The Stack is Empty\n");
     }
     else
     {
      *p = S->base[S->top --];
     }
    }


    一生只为自己珍视的人奋斗,哪怕是牺牲自己。
    2011年5月10日 12:35

答案

  • 貌似你错了吧,出错是在while()循环哪里,无法正确跳出循环。不过还是谢谢你啦
    一生只为自己珍视的人奋斗,哪怕是牺牲自己。
    • 已标记为答案 Rob Pan 2011年5月30日 2:28
    2011年5月11日 15:50

全部回复

  • 我试了一下,可以入栈啊。你在watch中用S->base[1] 看是有的。但是我在读参数的时候异常了。
    麻烦把正确答案设为解答。
    2011年5月11日 3:17
    版主
  • 可是就只有一个值,都是2,这明显不对,能再看看不?


    一生只为自己珍视的人奋斗,哪怕是牺牲自己。
    2011年5月11日 8:14
  • 没有啊,我这里看是3.00000000


    麻烦把正确答案设为解答。
    2011年5月11日 8:52
    版主
  • 那最终结果正确吗?应该是14


    一生只为自己珍视的人奋斗,哪怕是牺牲自己。
    2011年5月11日 9:14
  • 代码在for(; *(*argv + j) != '\0';)
    异常了。


    麻烦把正确答案设为解答。
    2011年5月11日 9:19
    版主
  • 貌似你错了吧,出错是在while()循环哪里,无法正确跳出循环。不过还是谢谢你啦
    一生只为自己珍视的人奋斗,哪怕是牺牲自己。
    • 已标记为答案 Rob Pan 2011年5月30日 2:28
    2011年5月11日 15:50