后缀表达式

常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表达示。逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*

正常的表达式 逆波兰表达式

  a+b ---> a,b,+
  a+(b-c) ---> a,b,c,-,+
  a+(b-c)*d ---> a,b,c,-,d,*,+
  a+d*(b-c)--->a,d,b,c,-,*,+
  a=1+3 ---> a=1,3 +

算法实现:

int Precedence(char sign)
{
  switch(sign)
  {
	  case '+':
	  case '-':
	  return 1;
	  case '*':
	  case '/':
	  return 2;
	  case '^':
	  case '%':
	  return 3;
	  case '(':
	  case '@':
	  default:
	  return 0;
  }
}

void Change(char* s1,char* s2)            //中缀表达式转换成后缀表达式
{ 
  seqstack T;
  int i=0,j=0;
  char ch;
  SetNull(&T);
  Push(&T,'@');
  ch=s1[i];
  while(ch!='\0')
	{
  	if(ch==' ')
	  	ch=s1[++i];
	  else if(ch=='(')
	  {
		  Push(&T,ch);
		  ch=s1[++i];
	  }
	  else if(ch==')')
	  {
		  while(GetTop(&T)!='(')
			  s2[j++]=Pop(&T);
		  Pop(&T);
		  ch=s1[++i];
	  }
	  else if(ch=='+' || ch=='-' ||ch=='*' ||ch=='/' ||ch=='^' ||ch=='%')
	  {
		  char w=GetTop(&T);
		  while(Precedence(w)>=Precedence(ch))
		  {
			  s2[j++]=w;
			  Pop(&T);
			  w=GetTop(&T);
		  }
		  Push(&T,ch);
		  ch=s1[++i];
	  }
	  else
		{
		  while((ch>='0' && ch<='9')||ch=='.')
		  {
			  s2[j++]=ch;
			  ch=s1[++i];
		  }
	  s2[j++]=' ';
	  }
	}
  ch=Pop(&T);
  while(ch!='@')
  {
	  s2[j++]=ch;
	  ch=Pop(&T);
  }
  s2[j++]='\0';
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值