首先明白:
前缀表达式:符号在前,如-×+3456
中缀表达式:符号在中间,如(3 + 4) × 5 - 6
后缀表达式:符号在最后,如34+5×6-,后缀表达式不出现括号。
中缀表达式转后缀表达式的方法:
1.遇到数字:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,将栈的元素全部输出,直到弹出栈的是左括
号为止,且左括号不输出直接删除
5.遇到其他运算符:加减乘除:若当前运算符小于等于栈中运算符优先级,依次出栈,然后再将该运算符入栈
6.最终将栈中的符号依次出栈,输出。
运算符优先级(常用的记忆一下,和常识吻合)
1 [] () (同级)
3 */
4 +-
代码
//定义一个运算符栈op
struct{
char data[MAXSIZE]; //存放运算符
int top; //栈顶指针
}op;
void trans(char exp[],char postexp[]){
char ch;
int i,j; //i是中缀exp的下标,j是后缀postexp的下标
op.top=-1;
ch=exp[i]; //获取输入的第一个字符
i++;
while(ch!='\0'){
switch(ch){
case '(': //遇到左括号直接入栈
op.top++;
op.data[op.top]=ch;
break;
case ')': //遇到右括号,栈顶元素不断出栈直到遇到左括号
while(op.data[op.top]!='('){
postexp[j]=op.data[op.top];
j++;
op.top--;
}
op.top--; //遇到了左括号,直接删除
break;
case '+': //因为加减运算符优先级最低,不大于任何其他运算符,所以直接入栈
case '-':
while(op.top!=-1&&op.data[op.top]!='('){ //栈不为空且没有遇到左括号,都直接出栈
postexp[j]=op.data[op.top];
j++;
op.top--;
}
op.top++; //即:栈为空或遇到了左括号,当前运算符进栈
op.data[op.top]=ch;
break;
case '*':
case '/':
while(op.top!=-1&&op.data[op.top]!='('&&(op.data[op.top]=='*'||op.data[op.top]=='/