定义栈类

 1 # python
 2 # -*- coding: utf-8 -*-
 3 """
 4 __title__ = ''
 5 __author__ = 'wlc'
 6 __mtime__ = '2017/10/12'
 7 """
 8 
 9 
10 class pythonStack:
11     def __init__(self):
12         # 使用list作为栈的底层实现
13         self.items = []
14 
15     def isEmpty(self):
16         return self.items == []
17 
18     def push(self, item):
19         self.items.append(item)
20 
21     def pop(self):
22         return self.items.pop()
23 
24     def peek(self):
25         return self.items[len(self.items) - 1]
26 
27     def size(self):
28         return len(self.items)

字符匹配 中缀式转换后缀式 后缀式求值

  1 # python
  2 # -*- coding: utf-8 -*-
  3 """
  4 __title__ = ''
  5 __author__ = 'wlc'
  6 __mtime__ = '2017/10/12'
  7 """
  8 
  9 from  dataStructure.dS import pythonStack
 10 
 11 # 类实例化
 12 stack = pythonStack.pythonStack()
 13 """
 14 push 进栈
 15 pop 出栈
 16 isEmpty 是否为空栈
 17 items 栈元素
 18 size 栈大小
 19 peek 返回栈顶
 20 
 21 """
 22 
 23 
 24 def parChecker(parString):
 25     """
 26     :program 括号匹配()
 27     :param parString: 括号串
 28     :return:True or False
 29     """
 30     flag = True
 31     s = pythonStack.pythonStack()
 32     index = 0
 33     while (index < len(parString)):
 34         str = parString[index]
 35         if (str == "("):
 36             s.push(str)
 37         else:
 38             if (s.isEmpty()):
 39                 flag = False
 40             else:
 41                 s.pop()
 42         index = index + 1
 43     if flag and s.isEmpty():
 44         return True
 45     else:
 46         return False
 47 
 48 
 49 def parCheckerAll(parString):
 50     """
 51     :program 符号匹配({[]})
 52     :param parString: 括号串
 53     :return:True or False
 54     """
 55     flag = True
 56     s = pythonStack.pythonStack()
 57     index = 0
 58     while (index < len(parString)):
 59         str = parString[index]
 60         if (str in "([{"):
 61             s.push(str)
 62         else:
 63             if (s.isEmpty()):
 64                 flag = False
 65             else:
 66                 par = s.pop()
 67                 if not match(par, str):
 68                     flag = False
 69         index = index + 1
 70     if flag and s.isEmpty():
 71         return True
 72     else:
 73         return False
 74 
 75 
 76 def match(par, str):
 77     """
 78     :program: pop 出的字符是否与}]) 匹配
 79     :param par:([{
 80     :param str:)]}
 81     :return:
 82     """
 83     pars = "([{"
 84     strs = ")]}"
 85     return pars.index(par) == strs.index(str)
 86 
 87 
 88 def divideBy2(num):
 89     """
 90     :program:十进制二进制
 91     :param num: 十进制
 92     :return: 二进制
 93     """
 94     s = pythonStack.pythonStack()
 95     while num > 0:
 96         push = num % 2
 97         s.push(push)
 98         num = num // 2
 99     binString = ""
100     while not s.isEmpty():
101         binString = binString + str(s.pop())
102     return binString
103 
104 
105 def divideByBase(num, base):
106     """
107     :program:十进制转换其他进制2-16
108     :param num: 十进制
109     :param base: 2-16进制
110     :return: 2-16进制
111     """
112     s = pythonStack.pythonStack()
113     jinzhi = "0123456789ABCDEF"
114     while num > 0:
115         push = num % base
116         s.push(push)
117         num = num // base
118     binString = ""
119     while not s.isEmpty():
120         binString = binString + jinzhi[s.pop()]
121     return binString
122 
123 
124 def infixToPostfix(func):
125     """
126     :program:中缀式转后缀式
127     :param func: 中缀式(string)
128     :return:后缀式(string)
129     """
130     # 栈用于存储操作符
131     s = pythonStack.pythonStack()
132     # 列表存储变量数字
133     numList = []
134     # 将输入的function切割成列表
135     funcsList = func.split(" ")
136     # 为了比较运算符优先级方便将运算符放到字典对其进行优先级赋值
137     opDict = {}
138     opDict["*"] = 3
139     opDict["/"] = 3
140     opDict["+"] = 2
141     opDict["-"] = 2
142     opDict["("] = 1
143     # 循环funcList
144     for funcList in funcsList:
145         # 如果funcList是变量数字则将其放到numList中
146         if funcList in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or funcList in "0123456789" or funcList in "abcdefghijklmnopqrstuvwxyz":
147             numList.append(funcList)
148         # 如果funclist是(的话 就将其push进入栈
149         elif funcList == "(":
150             s.push(funcList)
151         # 如果等于)则进行pop操作指导弹出(左括号
152         elif funcList == ")":
153             topFunc = s.pop()
154             while topFunc != "(":
155                 numList.append(topFunc)
156                 topFunc = s.pop()
157         # 如果是运算符则要进行压栈 如果  栈顶  有运算等级大于或者等于该运算符的运算符则要进行pop
158         else:
159             while (not s.isEmpty()) and opDict[s.peek()] >= opDict[funcList]:
160                 numList.append(s.pop())
161             # 将所有优先级高的运算符pop后进行push操作
162             s.push(funcList)
163     while not s.isEmpty():
164         numList.append(s.pop())
165     return " ".join(numList)
166 
167 
168 def postfixEval(func):
169     """
170     :program:后缀式计算
171     :param func: 后缀式
172     :return: 计算结果
173     """
174     # 初始化一个栈用于存储计算过程中产生的数据
175     s = pythonStack.pythonStack()
176     # 将func字符串 分割
177     funcsList = func.split(" ")
178     # 循环list
179     for funcList in funcsList:
180         # 如果是数字进行压栈
181         if funcList in "0123456789":
182             s.push(int(funcList))
183         else:
184             # 栈后进先出一次第一次pop出的是第二个操作数
185             op2 = s.pop()
186             op1 = s.pop()
187             result = doMath(funcList, op1, op2)
188             # 将计算结果压栈
189             s.push(result)
190     return s.pop()
191 
192 
193 def doMath(op, op1, op2):
194     if op == "*":
195         return op1 * op2
196     elif op == "/":
197         return op1 / op2
198     elif op == "+":
199         return op1 + op2
200     else:
201         return op1 - op2
202 
203 
204 if __name__ == '__main__':
205     print("判断栈是否为空:" + str(stack.isEmpty()))
206     stack.push(5)
207     print(stack.items)
208 
209     stack.pop()
210     print(stack.items)
211 
212     stack.push(5)
213     print("push一个item 栈大小:" + str(stack.size()))
214 
215     stack.push('cat')
216     stack.push('dog')
217     print(stack.items)
218 
219     stack.peek()
220     print("使用peek方法已经返回栈顶")
221     #######################################################
222     strPar = input("请输入括号串():")
223     var = parChecker(strPar)
224     print("是否括号匹配:" + str(var))
225     #######################################################
226     strPar = input("请输入字符串({[]}):")
227     var = parCheckerAll(strPar)
228     print("是否符号匹配:" + str(var))
229     #######################################################
230     var = input("请输入十进制数字:")
231     print("十进制 %s 转二进制:%s " % (var, divideBy2(10)))
232     #######################################################
233     var = input("请输入十进制数字:")
234     var1 = input("请输入要转换的进制2-16:")
235     print("十进制 %s 转 %s 进制:%s " % (var, var1, divideByBase(int(var), int(var1))))
236     #######################################################
237     var1 = input("请输入要转换成后缀式的中缀式:")
238     print("后缀式为:" + infixToPostfix(var1))
239     #######################################################
240     var1 = input("请输入要计算的后缀式:")
241     print("后缀式结果:" + str(postfixEval(var1)))
原文地址:https://www.cnblogs.com/wlc297984368/p/7658185.html