好多需要注意的点。。。改起来好烦。。。。。
#include <stdio.h>
#define maxsize 100
int compare_dominant(char a, char b)
{//比较运算符的优先级
if(a == '+' || a == '-' && b == '/' || b == '*')
return 0;
if(a == '/' || a == '*' && b == '+' || b == '-')
return 1;
if(a == '+' || a == '-' && b == '+' || b == '-')
return 0;
if(a == '/' || a == '*' && b == '/' || b == '*')
return 0;
}
void trans_post_exp(char exp[], char newexp[])
{//将中缀表达式(已存储在数组中)转换成后缀表达式,将后缀表达式存储在另一个数组中;
int i=0;
char stack[maxsize]; int top = -1;
for(int k=0; exp[k] != '#'; k++)
{
//扫描到左括号,则直接入栈
if(exp[k] == '(')
stack[++top] = exp[k];
//若扫描到右括号,则令栈顶元素出栈,并存入新数组中
else if(exp[k] == ')' && top != -1)
{
newexp[i++] = stack[top--];
if(stack[top] == '(')
top--;
}
//若扫描到字母,则直接存入新数组中;
else if(exp[k] != '+' && exp[k] != '-' && exp[k] != '/' && exp[k] != '*')
newexp[i++] = exp[k];
//若扫描到运算符,则将其与栈顶运算符比较优先级,如果新运算符优先级较高,将其入栈,
//否则栈顶元素出栈并入新数组,再将新运算符入栈
else
{
if(top == -1 || stack[top] == '(') //栈空或者栈顶元素为左括号时直接入栈
stack[++top] = exp[k];
else if(compare_dominant(exp[k], stack[top]) == 1)
stack[++top] = exp[k];
else //新运算符优先级不高于栈顶元素时,一直出栈,直到新运算符优先级高于栈顶元素
{
while(compare_dominant(exp[k], stack[top]) == 0 && top != -1)
newexp[i++] = stack[top--];
stack[++top] = exp[k];
}
}
}
while(top != -1 )
{
if(stack[top] != '(')
newexp[i++] = stack[top];
top--;
}
}
void print(char exp[])
{
for(int i=0; exp[i] != '#'; i++)
printf("%c", exp[i]);
}
int main()
{
char exp[maxsize];
char x; int i=0;
printf("请输入正确的表达式:\n");
while(x != '#')
{
x = getchar();
exp[i++] = x;
}
getchar(); //用于接收回车键
char newexp[maxsize];
for(int i=0; i<maxsize; i++)
newexp[i] = '#';
trans_post_exp(exp, newexp);
print(newexp);
return 0;
}