-
Notifications
You must be signed in to change notification settings - Fork 0
/
3-20(a)-09-25-09.33.c
100 lines (93 loc) · 1.68 KB
/
3-20(a)-09-25-09.33.c
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
/* 3-20(a)-09-25-09.33.c -- 第三章第二十题 */
#include <stdio.h>
#include <ctype.h>
#include "stack.h"
#define SIZE 20
#define NUL '\0'
int main (void) ;
/* PRI是优先级的缩写 */
int is_operation (const Item item) ;
int PRI (const Item item) ;
int main (void)
{
Stack stack ;
Item input[SIZE] ;
int count ;
InitializeStack (&stack) ;
gets (input) ;
for (count = 0; input[count] != NUL; count++)
{
if (isdigit (input[count]) || isalpha (input[count]))
putchar (input[count]) ;
else if (is_operation (input[count]))
{
if (StackIsEmpty (&stack))
Push (&stack, input + count) ;
else
{
if (')' == input[count])
{
while (Top (&stack) != '(')
{
putchar (Top (&stack)) ;
Pop (&stack) ;
}
Pop (&stack) ;
}
else
{
while (PRI (Top (&stack)) >= PRI (input[count]))
{
if ('(' == Top (&stack))
{
if (')' == input[count])
Pop (&stack) ;
else
break ;
}
else
{
putchar (Top (&stack)) ;
Pop (&stack) ;
}
}
}
if (input[count] != ')')
Push (&stack, input + count) ;
}
}
}
while (Top (&stack) != NUL)
{
putchar (Top (&stack)) ;
Pop (&stack) ;
}
DeleteStack (&stack) ;
return 0 ;
}
int is_operation (const Item item)
{
switch (item)
{
case '+' : return 1 ;
case '-' : return 1 ;
case '*' : return 1 ;
case '/' : return 1 ;
case '(' : return 1 ;
case ')' : return 1 ;
default : return 0 ;
}
}
int PRI (const Item item)
{
switch (item)
{
case NUL : return 0 ;
case '+' : return 1 ;
case '-' : return 1 ;
case '*' : return 2 ;
case '/' : return 2 ;
case '(' : return 3 ;
case ')' : return 3 ;
}
}