中缀表达式变后缀表达式
1. Target:用C语言实现字符的中缀式转换
〖Example〗 a*( b+c )/d = abc+*d/
2. Notice:
- The order of operands is the same in infix and postfix.(在中缀和后缀表达式中操作数的顺序是一致的)
- Operators with higher precedence appear before those with lower precedence.(更高优先级的操作符比更低优先级的操作符更先出现)
3. Introduction:
(1)定义优先级
枚举类型enum,可以一次性定义多个宏。
/*优先级,从小到大分别为 '=' ,在栈里的'(','+''-','*','/',在栈外的'(' */
enum priority{EQUAL=0,LKUO_IN=2,ADD=3,SUB=3,MUL=5,DEV=5,LKUO_OUT=6};
/*优先级数组*/
int prior[MAXN];
int prior_in[MAXN]; /*栈里栈外,the priority of '(' is different.*/
prior_in['='] = prior['='] = EQUAL;
prior_in['-'] = prior['-'] = SUB;
prior_in['+'] = prior['+'] = ADD;
prior_in['*'] = prior['*'] = MUL;
prior_in['/'] = prior['/'] = DEV;
prior['('] = LKUO_OUT;
prior_in['('] = LKUO_IN;
4. 完整代码
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200
enum priority{EQUAL=0,LKUO_IN=2,ADD=3,SUB=3,MUL=5,DEV=5,LKUO_OUT};/*优先级,从小到大*/
/*前缀变后缀*/
int main(){
char str[MAXN];
char stack[MAXN];
int i = 0;
/*优先级数组*/
int prior[MAXN];
int prior_in[MAXN]; /*栈里栈外,the priority of '(' is different.*/
prior_in['='] = prior['='] = EQUAL;
prior_in['-'] = prior['-'] = SUB;
prior_in['+'] = prior['+'] = ADD;
prior_in['*'] = prior['*'] = MUL;
prior_in['/'] = prior['/'] = DEV;
prior['('] = LKUO_OUT;
prior_in['('] = LKUO_IN;
int cursor = -1; /*means empty*/
stack[++cursor] = '='; /*预存一个'='*/
scanf("%s",&str);
while(str[i] != '\0'){
if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '('){
if(prior[str[i]] > prior_in[stack[cursor]]){
/*如果优先级比栈顶元素高,则入栈*/
stack[++cursor] = str[i];
}else{
/*如果优先级比栈顶元素低,则出栈直到优先级比栈顶元素高为止*/
while(prior_in[stack[cursor]] >= prior[str[i]]){
if(stack[cursor] != '(' && stack[cursor] != ')')
printf("%c",stack[cursor--]);
else
cursor--;
}
stack[++cursor] = str[i];
}
i++;
}else if('a'<= str[i] && str[i]<='z'){
/*不是操作符,直接输出*/
printf("%c",str[i]);
i++;
}else if(str[i] == ')'){
/*如果是 ")" ,则将符号栈栈内符号依次弹出,push,直到遇见 "(" 为止,*/
while(stack[cursor] != '('){
if(stack[cursor] != '(' && stack[cursor] != ')')
printf("%c",stack[cursor--]);
else
cursor--;
}
/*同时除去'(',')'*/
cursor--;
i++;
}else{
break;
}
}
/*最后的操作数读入后,栈非空,把栈中元素清空*/
while(stack[cursor] != '='){
if(stack[cursor] != '(' && stack[cursor] != ')')
printf("%c",stack[cursor--]);
else
cursor--;
}
return 0;
}
5. 实例展示
三个例子,第一个为1个括号;第二个为两个单独的括号,第三个为嵌套括号。