zoukankan      html  css  js  c++  java
  • 定义栈类

     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)))
  • 相关阅读:
    .netcore初体验
    ASP.NET MVC实现单用户登录
    远程连接桌面报:这可能是由于credssp加密oracle修正
    想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单
    List泛型与DataTable相互转换
    SqlServer-触发器
    SqlServer-RBAC五表权限
    SqlServer通用存储过程
    用vs2017结果无法启动IIS express
    简单的叙述下SQL中行列转换的小知识!
  • 原文地址:https://www.cnblogs.com/wlc297984368/p/7658185.html
Copyright © 2011-2022 走看看