函数如下:
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栈类型定义为模板类,把栈运算的函数定义为该类的公用成员函数,通过调用成员函数来实现栈的运算。这里对此不做深人讨论,留给读者作为练习。