• 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)))#对于个位数字运算可以直接加空格,对于多位数字需要在转为后缀字符串时操作  

     

     

     

     

     

  • 相关阅读:
    100 余个网页设计优化案例(用户体验、交互优化等方面)
    Tinyhttpd 源代码初步解读
    emlog pro 文章编辑器(editor.md)的快捷键
    什么是 CSS 设计模式
    原生 JS 实现 HTML 转 Markdown,以及其实现逻辑(html2md.js 或 html2markdown.js)
    【Example】C++ 回调函数及 std::function 与 std::bind
    【Example】C++运算符重载
    【小记】Linux find 配合 rm 命令安全批量删除文件
    【小记】Linux 快速查找并结束僵尸进程
    【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)
  • 原文地址:https://www.cnblogs.com/jasonhaven/p/7617100.html
Copyright © 2020-2023  润新知