#include<stdio.h>
//将中缀表达式转为后缀表达式,表达式有n位 ,数字只有一位
bool check(char ch1,char ch2){
if((ch1 == '+' || ch1 == '-') && (ch2 == '*'||ch2 == '/'))
//只有ch1的优先级小于ch2的优先级时才返回true
return true;
return false;
}
void infixToSuffix(char exp[],int n){ //中缀转后缀函数,n为表达式数组长度
//定义、初始化一个栈 ,stack用于保存暂时还不能确定运算顺序的运算符,
char stack[n];
int top=-1,suf=-1; //exp[]保存后缀表达式,suf为其栈顶指针
int i;
//依次扫描各个元素
for(i=0;i<n;++i){
if(exp[i] == '('){ //遇到左括号直接入栈
stack[++top] = exp[i];
}else if(exp[i] == ')'){ //遇到右括号,则依次弹出stack内运算符并加入后缀表达式
while(top != -1 && stack[top] != '('){ //直到弹出左括号为止
exp[++suf] = stack[top--];
}
}else if(exp[i]>='0'&&exp[i]<='9'){ //遇到操作数直接加入后缀表达式
exp[++suf] = exp[i]; //exp[i]为中缀表达式,exp[++suf]为后缀表达式
} else{
while(top != -1 && stack[top] != '('){ //遇到运算符,依次弹出栈中优先级高于
//或等于当前运算符,并加入后缀表达式
//若碰到“(”或栈空则停止
if(check(exp[i],stack[top]) ){
exp[++suf] = stack[top--];
}
}
stack[++top] = exp[i]; //将当前运算符入栈
}
}
if(top != -1){ //如果运算符不为空,则将剩下的运算符依次出栈,并加入后缀表达式
exp[++suf] = stack[top--];
}
while(suf<n){ //删除原表达式中剩余元素
exp[++suf] ='=';
}
}
int main(){
char exp[7];
exp[0]='(';
exp[1]='2';
exp[2]='+';
exp[3]='3';
exp[4]=')';
exp[5]='*';
exp[6]='2';
infixToSuffix(exp,7);
int i;
for(i=0;i<7;++i){
printf("%c",exp[i]);
}
return 1;
}
?
|