6.从中缀向后缀转换表达式
成绩 | 10 | 开启时间 | 2014年10月26日 Sunday 14:00 |
折扣 | 0.8 | 折扣时间 | 2014年11月9日 Sunday 23:55 |
允许迟交 | 是 | 关闭时间 | 2014年11月23日 Sunday 23:55 |
问题描述
中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式
(A 一 (B*C 十 D)*E) / (F 十 G )
转换为后缀表示为:
ABC*D十E*—FG十/
注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束
输入
整数N。表示下面有N个中缀表达式
N个由单个字母和运算符构成的表达式
输出
N个后缀表达式。
#include<stdio.h>
#include<string.h>
int cmp(char a, char b)
{
if (a == '(')
return -1;
if (a == b&&a=='^')
return -1;
if (a == b)
return 1;
if ((a == '*' || a == '/') && (b == '+' || b == '-'))
return 1;
if ((a == '+' || a == '-') && (b == '*' || b == '/'))
return -1;
if (a != '^'&&b == '^')
return -1;
if (a == '^'&&b != '^')
return 1;
if ((a == '+' || a == '-') && (b == '+' || b == '-'))
return 1;
if ((a == '*' || a == '/') && (b == '*' || b == '/'))
return 1;
}
int main()
{
int N;
char StackOperator[1000];
char map[1000];
int p;
int len;
int i;
scanf("%d", &N);
while (N--){
memset(StackOperator, 0, sizeof(StackOperator));
memset(map, 0, sizeof(map));
StackOperator[0] = '\0';
p = 1;
scanf("%s", map);
len = strlen(map);
for (i = 0; i < len - 1; i++){
if ((map[i] >= 'a'&&map[i] <= 'z') || (map[i] >= 'A'&&map[i] <= 'Z'))
printf("%c", map[i]);
else{
if (map[i] == '('){
StackOperator[p] = map[i];
p++;
}
else{
if (map[i] == ')'){
while (1){
if (StackOperator[p-1] == '('){
p--;
break;
}
else{
printf("%c", StackOperator[p-1]);
p--;
}
}
}
else{
if (cmp(StackOperator[p-1], map[i]) < 0){
StackOperator[p] = map[i];
p++;
}
else{
while (1){
if (cmp(StackOperator[p - 1], map[i])>0){
printf("%c", StackOperator[p - 1]);
p--;
}
else{
StackOperator[p] = map[i];
p++;
break;
}
}
}
}
}
}
}
while (1){
if (StackOperator[p - 1] != '\0'){
printf("%c", StackOperator[p - 1]);
p--;
}
else{
break;
}
}
printf("\n");
}
return 0;
}