1. 程式人生 > >棧的表示式之計算中綴、字首和字尾表示式

棧的表示式之計算中綴、字首和字尾表示式

1.計算中綴表示式

//判斷運算子優先順序
int getPriority(char op)
{
	if(op=='+'||op=='-')
		return 0;
	else 
		return 1;
} 
//計算表示式
int calsub(float opnd1,char op,float opnd2,float &result)
{
	if(op=='+')
		result=opnd1+opnd2;
	if(op=='-')
		result=opnd1-opnd2;
	if(op=='*')
		result=opnd1*opnd2;
	if(op=='\')
	{
		if(fabs(opnd2)<MIN)
			return 0;
		else
			result=opnd1/opnd1;
	}
	return 1;
} 
//計算棧
int calstack(float s1[],int &top1,float s2[],int &top2)
{
	float opnd1,opnd2;char op;
	int flag;
	op=s1[top1--];
	opnd2=s2[top2--];
	opnd1=s2[top2--];
	flag=calsub(opnd1,op,opnd2,result);
	s2[++top2]=result;
	return flag;
} 
float calinfix(char exp[])
{
	char s1[maxsize];int top1=-1;
	char s2[maxsize];int top2=-1;
	int i=0;
	while(exp[i]!='\0')
	{
		if(exp[i]>='0'&&exp[i]<='9')
		{
			s2[++top2]=exp[i];
			i++;
		}
		else if(exp[i]=='(')
		{
			s1[++top1]=exp[i];
			i++;
		}
		else if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='\')
		{
			if(top1==-1||s1[top1]=='('||getPriority(exp[i])>getPriority(s1[top1]))
			{
				s1[++top1]=exp[i];
				i++;
			}
			else
			{
				//計算
				int flag=calstack(s1,top1,s2,top2);
				if(flag==0)
					return 0; 
			}
		}
		else if(exp[i]==')')
		{
			while(s1[top1]!='(')
			{
				//計算
				int flag=calstack(s1,top1,s2,top2);
				if(flag==0) 
					return 0;
			}	
			--top1;
			++i;
		} 
	}
	while(top1!=-1)
	{
		//計算
		int flag=calstack(s1,top1,s2,top2);
		if(flag==0)
			return 0; 
	}
	return s2[top2];
}

2.計算字尾表示式(次頂 op 棧頂)

float calPostFix(char exp[])
{
	float s[maxsize];int top=-1;
	for(int i=0;exp[i]!='\0';i++)
	{
		if('0'<=exp[i]&&exp[i]<='9')
			s[++top]=exp[i]-'0';
		else
		{
			float opnd1,opnd2,result;
			char op;int flag;
			opnd2=s[top--];op=exp[i];
			opnd1=s[top--];
			flag=calsub(opnd1,op,opnd2,result);
			if(flag==0)
			{
				cout<<"error"<<endl;
				break;
			}
			s[++top]=result;
		}
	}
	return s[top];
}

3.計算字首表示式(棧頂op次頂)

float calPreFix(char exp[],int len)
{
	float s[maxsize];int top=-1;
	for(i=len-1;i>=0;i--)
	{
		if('0'<=exo[i]&&exp[i]<='9')
			s[++top]=exp[i]-'0';
		else
		{
			float opnd1,opnd2,result;
			char op;
			int flag;
			opnd1=s[top--];
			opnd2=s[top--];
			flag=calsub(opnd1,op,opnd2,result);
			if(flag==0)
			{
				cout<<"error"<<endl;
				break;
			}	
			s[++top]=result;
		}
	}
	return s[top];
}