数据结构之栈的应用(二):逆波兰计算器

1. 问题描述

输入:用户按照逆波兰表达式的形式从键盘输入一串字符(仅包括数字和运算符),数字和运算符之间用空格隔开,以#作为输入结束标志;

输出:得到最终的计算结果。

2. 算法思想

(1)若读入的是数字,则将其压入栈中;

(2)若读入的是运算符,则从栈中弹出适当数量的数字并进行计算,然后将计算结果再压回到栈中;

(3)处理完整个后缀表达式之后,栈顶上的元素即为表达式的最终结果。

3. C语言源代码

int main()
{
	SeqStack *s;
	char c;
	double d,e;
	int i=0;

	s=createStack(size);

	printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为输入结束标志:\n");
	scanf("%c",&c);


	while(c!='#')
	{
		while(isdigit(c)||c=='.')         // 用于过滤数字,并将数字压入栈中
		{
			str[i++]=c;
			str[i]='\0';
			if(i>maxbuffer)
			{
				printf("\n出错:单个数据太大!\n");
				return -1;
			}
			scanf("%c",&c);
			if(c==' ')    // 说明单个数据输入完毕
			{
				e=atof(str);
				push(s,e);
				i=0;
				break;
			}
		}
		switch(c)
		{
		case '+':
			pop(s,&d);
			pop(s,&e);
			push(s,d+e);
			break;
		case '-':
			pop(s,&d);
			pop(s,&e);
			push(s,e-d);
			break;
		case '*':
			pop(s,&d);
			pop(s,&e);
			push(s,e*d);
			break;
		case '/':
			pop(s,&d);
			pop(s,&e);
			if(d!=0)
				push(s,e/d);
			else
			{
				printf("\n输入出错,除数为零!\n");
				return -1;
			}
			break;
		}
		scanf("%c",&c);
	}
	pop(s,&e);
	printf("\n最终的计算结果为:%f\n",e);

	return 0;
}

 

 

 

 

你可能感兴趣的:(数据结构C语言版,数据结构,算法,栈)