将中缀表达式转换为后缀表达式

函数如下:

void Change(char *s1,char *s2)
{
	Stack R;
	InitStack(R);
	Push(R,'@');
	int i = 0;  //用于指示扫描s1串中字符的位置,初值为0
	int j = 0;  //用于指示s2串中待存字符的位置,初值为0
	char ch = s1[i];
	while(ch != '@')
	{
		switch(ch)
		{
			case ' ':
				ch = s1[++i];
				break;
			case '(':
				Push(R,ch);
				ch = s1[++i];
				break;
			case ')':
				while(Peek(R) != '(')
					s2[j++] = Pop(R);
				Pop(R);
				ch = s1[++i];
				break;
			case '+':
			case '-':
			case '*':
			case '/':
				char w = Peek(R);
				while(Precedence(w) >= Precedence(ch))
				{
					s2[j++] = w;
					Pop(R);
					w = Peek(R);
				}
				Push(R,ch);
				ch = s1[++i];
				break;
			default:
				while(ch == '.' || isdigit(ch))
				{
					s2[j++] = ch;
					ch = s1[++i];
				}
				s2[j++] = ' ';
				break;
		}
	}
	ch = Pop(R);
	while(ch != '@')
	{
		if(ch == '(')
		{
			cerr<<"expression error!"<<endl;
			exit(1);
		}
		s2[j++] = ch;
		ch = Pop(R);
	}
	s2[j++] = '@';
	s2[j++] = '\0';
}

//求运算符优先级
int Precedence(char op)
{
	if(op == '+' || op == '-')
		return 1;
	if(op == '*' || op == '/')
		return 2;
	else
		return 0;
}
      在上述讨论的中缀算术表达式求值的两个算法中,把中缀表示转换为后缀表示的算法需要使用一个字符栈,而进行后缀表达式求值的算法又需要使用一个浮点数栈,这两个栈的元素类型不同,所以栈的类型无法作为全局量来定义,栈运算的函数也无法适应这种要求。为了解决这个问题,必须把Stack栈类型定义为模板类,把栈运算的函数定义为该类的公用成员函数,通过调用成员函数来实现栈的运算。这里对此不做深人讨论,留给读者作为练习。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值