zoukankan      html  css  js  c++  java
  • Python基本数据结构

    class Stack:
    
        def __init__(self):
            self.items = []
    
    
        def isEmpty(self):
            return self.items == []
    
        def push(self, item):
            self.items.append(item)
    
        def pop(self):
            return self.items.pop()
    
        def peek(self):
            return self.items[len(self.items)-1]
    
        def size(self):
            return len(self.items)  

    队列

    class Queue:
    
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return self.items == []
    
        def enqueue(self, item):
            self.items.insert(0,item)
    
        def dequeue(self):
            return self.items.pop()
    
        def size(self):
            return len(self.items)

    双端队列

    class Deque:
    
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return self.items == []
    
        def addFront(self, item):
            self.items.append(item)
    
        def addRear(self, item):
            self.items.insert(0,item)
    
        def removeFront(self):
            return self.items.pop()
    
        def removeRear(self):
            return self.items.pop(0)
    
        def size(self):
            return len(self.items)

    括号匹配

    def check(s):
    	lefts = ['(', '[', '{']
    	rights = [')', ']', '}']
    	stack = Stack()
    	for c in s:
    		if c in lefts:
    			stack.push(c)
    	else:
    		if stack.is_empty():
    			return False
    	c_pop = stack.pop()
    	if lefts.index(c_pop) != rights.index(c):
    		return False
    	if stack.is_empty:
    		return True
    	return False
    

    进制转换

    def divideBy2(decNumber):
    	reback = Stack()
    	while (decNumber > 0):
    		reback.push(decNumber % 2)
    	decNumber = decNumber // 2
    	binstr = ''
    	while not reback.is_empty():
    		binstr = binstr + str(reback.pop())
    	return binstr
    
    def baseConverter(decNumber, base):
    	'''
    	将十进制数字转成任意进制数字
    	'''
    	digits = '0123456789ABCDEF'
    	reback = Stack()
    	while (decNumber > 0):
    		reback.push(decNumber % base)
    	decNumber = decNumber // base
    	basestr = ''
    	while not reback.is_empty():
    		basestr = basestr + digits[reback.pop()]
    	return basestr
    

    两个栈实现队列

    # coding:utf-8
    
    from pythonds.basic.stack import Stack
    
    
    class StacToQueue(object):
    	def __init__(self):
    		self.stack_one = Stack()
    		self.stack_two = Stack()
    
    	def enqueue(self, item):
    		self.stack_one.push(item)
    
    	def dequeue(self):
    		if self.stack_two.isEmpty():
    			while not self.stack_one.isEmpty():
    				self.stack_two.push(self.stack_one.pop())
    		return self.stack_two.pop()
    
    	def size(self):
    		return len(self.stack_one) + len(self.stack_two)
    
    	def isEmpty(self):
    		return self.size() == 0
    
    
    class Dequeue(object):
    	def __init__(self):
    		self.items = []
    
    	def enqueueFront(self, item):
    		self.items.insert(0, item)
    
    	def dequeueRear(self):
    		return self.items.pop()
    
    	def enqueueRear(self, item):
    		self.items.append(item)
    
    	def dequeueFront(self):
    		return self.items.pop(0)
    
    	def size(self):
    		return len(self.items)
    
    	def isEMpty(self):
    		return self.items == []
    
    
    if __name__ == '__main__':
    	queue = StacToQueue()
    	for x in range(5):
    		queue.enqueue(x)
    	for x in range(5):
    		print(queue.dequeue())
    

    回文判断

    def palchecker(string):
    	chardequeue = Dequeue()
    	for ch in string:
    		chardequeue.enqueueFront(ch)
    	while not chardequeue.isEMpty():
    		front = chardequeue.dequeueFront()
    		rear = chardequeue.dequeueRear()
    		if front != rear:
    			return False
    	return True
    
    
    if __name__ == '__main__':
    	print(palchecker("123321"))
    	print(palchecker("124561"))

     中缀表达式转前缀表达式或者后缀表达式

    # coding:utf-8
    
    from pythonds.basic.stack import Stack
    
    
    def infixToPostfix(infixexpr):
    	# 记录优先级
    	prec = {}
    	prec["*"] = 3
    	prec["/"] = 3
    	prec["+"] = 2
    	prec["-"] = 2
    	prec["("] = 1
    	# 操作符栈
    	opStack = Stack()
    	# 后缀
    	postfixList = []
    	# 单词列表
    	tokenList = infixexpr.split(' ')
    	for token in tokenList:
    
    		if token.isdigit():  # 分词部分纯数字
    			postfixList.append(token)
    
    		elif token == '(':
    			opStack.push(token)
    
    		elif token == ')':
    			topToken = opStack.pop()
    			while topToken != '(':
    				postfixList.append(topToken)
    				topToken = opStack.pop()
    
    		else:
    			while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
    				postfixList.append(opStack.pop())
    			opStack.push(token)
    
    	while not opStack.isEmpty():
    		postfixList.append(opStack.pop())
    
    	return "".join(postfixList)
    
    
    def infixToPrefix(infixexpr):
    	# 记录优先级
    	prec = {}
    	prec["*"] = 3
    	prec["/"] = 3
    	prec["+"] = 2
    	prec["-"] = 2
    	prec["("] = 1
    	# 操作符栈
    	opStack = Stack()
    	# 后缀
    	prefixList = []
    	# 单词列表
    	tokenList = infixexpr.split(' ')
    	for token in tokenList:
    
    		if token.isdigit():
    			prefixList.insert(0, token)
    
    		elif token == '(':
    			opStack.push(token)
    
    		elif token == ')':
    			topToken = opStack.pop()
    			while topToken != '(':
    				prefixList.insert(0, topToken)
    				topToken = opStack.pop()
    
    		else:
    			while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
    				prefixList.insert(0, opStack.pop())
    			opStack.push(token)
    
    	while not opStack.isEmpty():
    		prefixList.insert(0, opStack.pop())
    
    	return "".join(prefixList)
    
    
    def caculatePostfix(postfixexp):
    	numbers = "0123456789"
    	tokenList = postfixexp.split(' ')
    	numStack = Stack()
    	for token in tokenList:
    		if token in numbers:
    			numStack.push(int(token))
    		else:
    			numb = numStack.pop()
    			numa = numStack.pop()
    			result = doMath(numa, numb, token)
    			numStack.push(result)
    	return numStack.pop()
    
    
    def doMath(a, b, op):
    	if op == '+':
    		return a + b
    	elif op == '-':
    		return a - b
    	elif op == '*':
    		return a * b
    	elif op == '/':
    		return a / b
    
    
    if __name__ == '__main__':
    	postList = infixToPostfix("1 + 3 * 5 / ( 6 - 4 )")
    	print(postList)
    
    	pretList = infixToPrefix("1 + 3 * 5 / ( 6 - 4 )")
    	print(pretList)
    
    	print(caculatePostfix(" ".join(postList)))#对于个位数字运算可以直接加空格,对于多位数字需要在转为后缀字符串时操作  

     

     

     

     

     

  • 相关阅读:
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Navicat查询哪些表有指定字段名
  • 原文地址:https://www.cnblogs.com/jasonhaven/p/7617100.html
Copyright © 2011-2022 走看看