首页 新闻 会员 周边 捐助

c语言实现逆波兰表达式求值,编译无误,跑不出结果。

0
[已解决问题] 解决于 2022-03-22 12:30

include <stdio.h>

include <stdlib.h>

include <ctype.h>

define STACK_INIT_SIZE 20

define STACKINCREMENT 10

define MAXBUFFER 10

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;

}

小王_Pear的主页 小王_Pear | 初学一级 | 园豆:190
提问于:2021-10-28 22:54

在线等,很捉集。

爱code的小小白 3年前
< >
分享
最佳答案
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;

因为我不知道这个东西,如果你其他写的代码正确,那就应该没问题了。

提问建议:

  1. 请正确使用代码块功能,乱七八糟,影响体验。
  2. 遇到问题,你要明白的一个有力的工具,那就是调试。正确的调试方法基本能够解决所有问题。
奖励园豆:5
寂静的羽夏 | 老鸟四级 |园豆:2091 | 2021-10-29 12:11

不好意思,代码粘错了。。。

小王_Pear | 园豆:190 (初学一级) | 2021-10-29 12:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册