求前缀表达式的值(利用数组去模拟栈)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

思路:学过数据结构的应该都知道前缀表达式是什么,也知道应该使用栈去解题,我们也可以用数组模拟栈,这样更加的方便。

我们首先利用一个string数组s把所有的这些表达式都读进来,把top初始化为0,top表示这个数组即将要入栈的元素的位置,然后在设置另外一个栈数组,把s数组的元素出栈,如果是数字就压进另一个栈数组里,如果不是数字,那么我们就从另一个数组弹出两个数字,把这两个数字进行对应的操作( + - * /)
isdigit(),判断一个字符是否是一个数字(头文件#include<ctype.h>)
代码:

#include<bits/stdc++.h>
using namespace std;
string s[110];
int top=0,top1=0;
double y[110];
int main()
{
	string x;//可能是不止一位数的整数,所以要用string 
	while(cin>>x)
	   s[top++]=x;
	while(top>0)
	{
		 x=s[--top];
		 if(isdigit(x[x.size()-1]))
		 {
		 	double k=atof(x.c_str());
		 	y[top1++]=k;
		 }
		 else
		 {
		 	if(top1<2)  break;
		 	 double c=y[--top1],d=y[--top1];            //否则执行到这里就是数据库里两个不小于两个数字 
			 if(x[0]=='+')    y[top1++]=c+d;
			 if(x[0]=='-')    y[top1++]=c-d;
			 if(x[0]=='*')    y[top1++]=c*d;
			 if(x[0]=='/')
			 {
			 	if(d==0)
			 	{
			 		top++;
			 		break;
				 }
				 y[top1++]=c*1.0/d;
			 }
		 }
	}
	if(top>0||top1>1)
	printf("ERROR\n");
	else
	printf("%.1f\n",y[--top1]);
    return 0;
}

发布了36 篇原创文章 · 获赞 21 · 访问量 511

猜你喜欢

转载自blog.csdn.net/qq_42090769/article/details/103915244