7-20 表达式转换 (25 分)

7-20 表达式转换 (25 分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

1
2+3*(7-4)+8/4

输出样例:

1
2 3 7 4 - * + 8 4 / +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int IsNum( char c);
int IsZhengfu( char c);
int Compare( char a, char b);

int main()
{
char str1[21];
char str2[21];
int len;
int flag =0; //表示str2是否为空
int i,j;
int space =0;

scanf("%s",str1);
len = strlen(str1);

for( i=0; i<len; i++)
{
if(IsNum(str1[i]))
{
//str1[i]是数字则输出
if( space )
{
printf(" ");
space = 0;
}
printf("%c",str1[i]);
}
else if( IsZhengfu(str1[i]) && (i? !IsNum(str1[i-1]) && str1[i-1]!=')':1))
{
//若第一个符号是负号或者出现连续两个符号
if( str1[i]=='-')
{
if(space)
{
printf(" ");
space = 0;
}
printf("%c",str1[i]);
}
}
else
{
//其他符号
if( flag)
{
if( str1[i]==')')
{
//str2出栈直至遇到(
while( flag--)
{
if(str2[flag]=='(') break;
printf(" %c",str2[flag]);
}
}
else
{
while( flag )
{
//str2内不为空,比较栈顶与str1[i]的优先级
if( Compare( str2[flag-1],str1[i]))
{
//若str1优先级低,出栈
printf(" %c",str2[--flag]);
}
else break;
}
str2[flag++] = str1[i];
}
}
else str2[flag++] = str1[i];
for ( j=0; j<flag; j++)
{
if( str2[j]!='(')
{
//遇见‘(’不输出空格
space = 1;
break;
}
}
}
}
while (flag)
{
printf(" %c",str2[--flag]);
}

return 0;
}

int IsNum( char c)
{
//c是数字,注意题目数据会有小数
return ( c >='0'&&c<='9')||c=='.';
}

int IsZhengfu( char c)
{
return c=='+' || c=='-';
}

int Compare( char a, char b)
{
//比较两个符号优先级
//连续的两个case语句表示这两个case是同一种情况
if( b==')') return 1;
if( b=='(' || a=='(') return 0;

switch(b)
{
case '+':
case '-':
return 1;
case '*':
case '/':
switch(a)
{
case '+':
case '-':
return 0;
case '*':
case '/':
return 1;
}

}
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×