typedef double ElemType;
typedef struct
{
ElemType* base;
ElemType* top;
int stackSize;
}sqStack;
void InitStack(sqStack* s)
{
s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!s->base)
exit(0);
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}
void Push(sqStack* s, ElemType e)
{
//栈满,追加空间
if (s->top - s->base >= s->stackSize)
{
s->base = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if (!s->base)
exit(0);
s->top = s->base + s->stackSize;
s->stackSize += STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack* s, ElemType* e)
{
if (s->top = s->base)
return;
*e = *--(s->top);
}
int StackLen(sqStack s)
{
return (s.top - s.base);
}
int main(void)
{
sqStack s;
InitStack(&s);
char c;
char str[MAXBUFFER];
double d, e;
int i = 0;
printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#为结束标志!\n");
scanf("%c", &c);
while (c != '#')
{
while (isdigit(c) || c == '.')
{
str[i++] = c;
str[i] = '\0';
if (i >= 10)
{
printf("\n输入数据过大!!!\n");
return -1;
}
scanf("%c", &c);
if (c == ' ')
{
d = atof(str);
Push(&s, d);
i = 0;
break;
}
}
switch (c)
{
case '+' :
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d + e);
break;
case '-' :
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d - e);
break;
case '*' :
Pop(&s, &e);
Pop(&s, &d);
Push(&s, d * e);
break;
case '/' :
Pop(&s, &e);
Pop(&s, &d);
if (e != 0)
{
Push(&s, d / e);
}
else
{
printf("\n输入数据有误!!!\n");
return -1;
}
break;
}
scanf("&c", &c);
}
double f;
Pop(&s, &f);
printf("\n最终结果为 :%f!!!\n", f);
return 0;
}
虽然我不知道逆波兰表达式是啥,但肯定有一个错误,如下图所示:
case ']':
if (s.top != s.base)
{
GetTop(s, e);
if (e = '[') //这里错了,改为 if (e == '[')
{
Pop(s, e);
flag = 1;
}
else
flag = 0;
}
else
exit(0);
break;
因为我不知道这个东西,如果你其他写的代码正确,那就应该没问题了。
提问建议:
不好意思,代码粘错了。。。
在线等,很捉集。
– 爱code的小小白 3年前