当前位置 博文首页 > Zhi Zhao的博客:数据结构之栈的应用(二):逆波兰计算器

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

    作者:[db:作者] 时间:2021-08-08 13:10

    1. 问题描述

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

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

    2. 算法思想

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

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

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

    3. C语言源代码

    int main()
    {
    	SeqStack *s;
    	char c;
    	double d,e;
        char str[maxbuffer];
    	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;
    }

    ?

    ?

    ?

    ?

    cs
    下一篇:没有了