1
+ class Stack (object ):
2
+ def __init__ (self ):
3
+ self .items = []
4
+ def is_empty (self ):
5
+ return self .items == []
6
+ def peek (self ):
7
+ return self .items [len (self .items ) - 1 ]
8
+ def size (self ):
9
+ return len (self .items )
10
+ def push (self , item ):
11
+ self .items .append (item )
12
+ def pop (self ):
13
+ return self .items .pop ()
14
+ def delete (self ):
15
+ self .items = []
16
+ def operate (a ,o ,b ):
17
+ if (o == '*' ): return a * b
18
+ elif (o == '/' ): return a / b
19
+ elif (o == '+' ): return a + b
20
+ elif (o == '-' ): return a - b
21
+ def precede (a ,b ):
22
+ if (a != '#' ):
23
+ if (a == '+' or a == '-' ):
24
+ if (b == '+' or b == '-' or b == ')' or b == '#' ):
25
+ return '>'
26
+ elif (b == '*' or b == '/' or b == '(' ):
27
+ return '<'
28
+ elif (a == '*' or a == '/' ):
29
+ if (b == '(' ):
30
+ return '<'
31
+ else : return '>'
32
+ elif (a == '(' ):
33
+ if (b == ')' ):
34
+ return '='
35
+ else : return '<'
36
+ elif (a == ')' ):
37
+ return '>'
38
+ elif (a == '#' ):
39
+ if (b == '#' ): return '='
40
+ else :
41
+ return '<'
42
+ intNumber = []
43
+ for n in range (10 ):
44
+ intNumber .append (str (n ))
45
+ def isInt (x ):
46
+ for n in intNumber :
47
+ if (x == n ): return 1
48
+ return 0
49
+ def jisuan (s ):
50
+ #a = input("输入表达式:" + "\n")
51
+ b = list (s )
52
+ b .append ('#' )
53
+ #print(b)
54
+ OPTR = Stack ()
55
+ Number = Stack ()
56
+ operator = Stack ()
57
+ operator .push ('#' )
58
+ i = 0
59
+ NumberTemp = []
60
+ while (True ):
61
+ print ("本次输入为:" , b [i ],end = '\t ' )
62
+ print ("运算符栈为:" , operator .items , end = '\t ' )
63
+ if (b [i ] == '*' or b [i ] == '/' or b [i ] == '+' or b [i ] == '-' or b [i ] == '(' or b [i ] == ')' or b [i ] == '#' ):
64
+ # print("nt",NumberTemp)
65
+ if (NumberTemp != []):
66
+ Nt = "" .join (NumberTemp )
67
+ Number .push (float (Nt ))
68
+ NumberTemp = []
69
+ if (precede (operator .peek (), b [i ]) == '<' ):
70
+ operator .push (b [i ])
71
+ elif (precede (operator .peek (), b [i ]) == '=' ):
72
+ x = operator .pop ()
73
+ elif (precede (operator .peek (), b [i ]) == '>' ):
74
+ theta = operator .pop ()
75
+ x2 = Number .pop ()
76
+ x1 = Number .pop ()
77
+ print ("运算" , x1 , theta , x2 , end = '\t ' )
78
+ Number .push (operate (x1 , theta , x2 ))
79
+ i -= 1
80
+ elif (isInt (b [i ]) == 1 or b [i ] == '.' ):
81
+ NumberTemp .append (b [i ])
82
+ elif (b [i ] <= 'z' and b [i ] >= 'A' ):
83
+ cTemp = b [i ]
84
+ b [i ] = input ("输入" + b [i ] + "的值\n " )
85
+ for j in range (i ,len (b )):
86
+ if (b [j ] == cTemp ):
87
+ b [j ] = b [i ]
88
+ NumberTemp .append (b [i ])
89
+ else :
90
+ NumberTemp .append (b [i ])
91
+ # if (b[i] != '#'):
92
+ print ("运算数栈为:" , Number .items , end = '\n ' )
93
+
94
+ i += 1
95
+ # elif(b[i] == '#'):
96
+ #
97
+ if (operator .peek () == '#' and b [i ] == '#' ):
98
+ print ("本次输入为:" , b [i ],end = '\t ' )
99
+ print ("运算符栈为:" , operator .items , end = '\t ' )
100
+ print ("运算数栈为:" , Number .items , end = '\n ' )
101
+
102
+ break
103
+ if (Number .is_empty () != True ): print ("\n \n 运算结果为:" , Number .peek ())
104
+ else : print ("\n \n 运算结果为:" , float ("" .join (NumberTemp )))
105
+ '''a = input("输入表达式:" + "\n ")
106
+ b = list(a)
107
+ b.append('#')
108
+ print(b)
109
+ OPTR = Stack()
110
+ Number = Stack()
111
+ operator = Stack()
112
+ operator.push('#')
113
+ i = 0
114
+ NumberTemp = []
115
+ while(True):
116
+ print("运算符栈为:",operator.items,end='\t ')
117
+ if (b[i] == '*' or b[i] == '/' or b[i] == '+' or b[i] == '-' or b[i] == '(' or b[i] == ')' or b[i] == '#'):
118
+ #print("nt",NumberTemp)
119
+ if(NumberTemp != []):
120
+ Nt = "".join(NumberTemp)
121
+ Number.push(float(Nt))
122
+ NumberTemp = []
123
+ if(precede(operator.peek(),b[i]) == '<'):
124
+ operator.push(b[i])
125
+ elif(precede(operator.peek(),b[i]) == '='):
126
+ x = operator.pop()
127
+ elif(precede(operator.peek(),b[i]) == '>'):
128
+ theta = operator.pop()
129
+ x2 = Number.pop()
130
+ x1 = Number.pop()
131
+ print("运算",x1,theta,x2,end='\t ')
132
+ Number.push(operate(x1,theta,x2))
133
+ i -= 1
134
+ elif(isInt(b[i]) == 1 or b[i] == '.'):
135
+ NumberTemp.append(b[i])
136
+ else:
137
+ b[i] = input("输入" + b[i] + "的值\n ")
138
+ NumberTemp.append(b[i])
139
+ #if (b[i] != '#'):
140
+ print("运算数栈为:", Number.items, end='\t ')
141
+ print("本次输入为:", b[i])
142
+ i += 1
143
+ #elif(b[i] == '#'):
144
+ #
145
+ if(operator.peek() == '#' and b[i] == '#'):
146
+ print("运算符栈为:", operator.items, end='\t ')
147
+ print("运算数栈为:",Number.items,end='\t ')
148
+ print("本次输入为:",b[i])
149
+ break
150
+ print("\n \n 运算结果为:",Number.peek())'''
151
+ if __name__ == '__main__' :
152
+ s = input ("输入表达式:" + "\n " )
153
+ jisuan (s )
0 commit comments