运算符定义优先级:# ( + - * /
-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; }