# 二级指针，栈

• ### 问题

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

#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（）循环哪里，无法正确跳出循环。不过还是谢谢你啦
一生只为自己珍视的人奋斗，哪怕是牺牲自己。
• 已标记为答案 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（）循环哪里，无法正确跳出循环。不过还是谢谢你啦
一生只为自己珍视的人奋斗，哪怕是牺牲自己。
• 已标记为答案 2011年5月30日 2:28
2011年5月11日 15:50