运算符定义优先级:# ( + - * /
-1 0 1 1 2 2
从原表达式求后缀式的规则为:
1.新建运算符栈,栈底元素为"#"(作为运算符栈的结束符号),从第一个位置起扫描表达式
2.若当前字符是操作数,则直接发送给后缀表达式,扫描位置加1;
3.若当前字符为运算符且优先级大于栈顶运算符,则进栈,扫描位置加1。
4.若当前字符为运算符且优先级不大于(小于等于)栈顶运算符,则退出栈顶运算符并将其发送给后缀式,并将将当前运算符放入栈中,扫描位置不变。
5.若当前字符为"(",直接进栈,扫描位置加1。
6.若当前字符为")",则从栈顶起,依次将栈中"("之前的运算符出栈并发送给后缀式,并将栈中"("出栈,扫描位置加1。
7.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式(不包括运算符的结束符号)。
代码如下:
char *RPExpression(char *e)
/* 返回表达式e的逆波兰式 */
{
Stack s;
InitStack(s);
Push(s,'#');
char c;
char *t;
t=(char*)malloc(strlen(e)*sizeof(char));
int i,j=0;
for(i=0;e[i]!='\0';i++)
{
if((e[i]!='+')&&(e[i]!='-')&&(e[i]!='*')&&(e[i]!='/')&&(e[i]!='(')&&(e[i]!=')'))
{
t[j]=e[i];
j++;
continue;
}
switch(e[i])
{
case '+':
case '-':
{
c=Top(s);
if(c=='('||c=='#')
{
Push(s,e[i]);
break;
}
else
{
Pop(s,c);
t[j]=c;
j++;
i--;
break;
}
}
case '*':
case '/':
{
c=Top(s);
if(c=='*'||c=='/')
{
Pop(s,c);
t[j]=c;
j++;
i--;
break;
}
else
{
Push(s,e[i]);
break;
}
}
case '(':
{
Push(s,e[i]);
break;
}
case ')':
{
while(Top(s)!='(')
{
Pop(s,c);
t[j]=c;
j++;
}
Pop(s,c);
break;
}
}
}
while(Top(s)!='#')
{
Pop(s,c);
t[j]=c;
j++;
}
t[j]='\0';
return t;
}