定义栈类
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)))