中缀表达式化后缀表达式:
(1+3)/8*3-5=
构建一个空运算符栈。先向里面压入一个‘=‘(方便后边的比较)。然后从左向右扫描中缀表达式,如果是操作数,则直接输出即可;如果是左括号则直接入栈,如果是右括号,则弹栈,直到左括号且将左括号也弹出;如果是其他运算符,则按照乘除优先于加减,如果是乘除(加减)则按照谁先进栈谁优先,即a优先于b表示为a>b,如果栈顶元素优先于当前元素,则一直弹栈,直到栈顶优先级小于当前元素优先级,将当前元素压栈,如果优先级相同,只需弹栈就可以了。
/*比较栈顶元素跟当前运算符优先级*/ char suf_compare(char op1,char op2){ if(op1==‘+‘||op1==‘-‘){ if( op2==‘(‘ || op2==‘*‘ || op2==‘/‘) return ‘<‘; else return ‘>‘; } if(op1==‘*‘||op1==‘/‘){ if(op2==‘(‘) return ‘<‘; else return ‘>‘; } if(op1==‘=‘||op1==‘(‘){ if((op1==‘=‘&&op2==‘=‘)||(op1==‘(‘&&op2==‘)‘)){ return ‘=‘; }else{ return ‘<‘; } } }
中缀表达式化前缀表达式:
构建两个栈,一个缓存运算符空栈(压入‘=’)和一个存前缀表达式的空栈。从右往左扫描中缀表达式,如果是操作数,则直接压入表达式栈;如果是右括号,则直接入运算符栈,如果是左括号,则将运算符栈弹栈转移压入表达式栈,直到遇到右括号,舍弃括号。如果是其他运算符,则按照乘除优先于加减,如果是乘除(加减)则按照谁后进栈谁优先。如果栈顶元素优先于当前元素,则一直弹栈,直到栈顶优先级小于当前元素优先级,将当前元素压栈,如果优先级相同,只需弹栈就可以了。
/* 中缀化前缀的运算符比较函数,运算符栈栈顶元素跟当前运算符优先级比较。 */ char pre_compare(char a,char b){ if(a==‘+‘||a==‘-‘){ if(b==‘(‘||b==‘=‘){ return ‘>‘; }else{ return ‘<‘; } } if(a==‘*‘||a==‘/‘){ if(b==‘)‘||b==‘*‘||b==‘/‘){ return ‘<‘; }else{ return ‘>‘; } } if(a==‘)‘||a==‘=‘){ if(a==‘)‘&&b==‘(‘||a==‘=‘&&b==‘=‘){ return ‘=‘; }else{ return ‘<‘; } } }
时间: 2024-10-06 01:09:54