因为最近要完成有关树的搜索的算法,涉及到深度、广度优先遍历,因此很有必要将栈和队列这个景点数据结构回顾一遍,使用Python语言编码。因为实在是比较简单,没加注释,同行有需要的直接拷贝过去就行
话不多说先上栈操作的代码:
#coding:utf-8 class Stack(object): def __init__(self): self.stack = [] self.top = 0 #初始化栈顶为0 def push(self, data): #入栈 i = 0 lenth = len(data) for i in range(lenth): self.stack.append(data[i]) self.top += 1 #栈顶指针后移一个位置 print("入栈后的栈顶位置:top->%d" %(self.top-1)) return self.stack def pop(self,stack): #出栈 self.top = len(stack) -1 k = self.top for i in range(k+1): print("top->%d:%d" %(self.top, stack[self.top])) self.top -= 1 data = [] lenth = input("请输入data的长度:") for i in range(lenth): x = input() data.append(x) print("data:%s" %data) s = Stack() stack = s.push(data) print("stack:%s,lenth:%d" %(stack, len(stack))) s.pop(stack)
队列的代码如下:
#coding:utf-8 class Queue(object): def __init__(self): self.queue = [] self.topleft = 0 self.topright = 0 def push(self, data): lenth = len(data) i = 0 for i in range(lenth): self.topright += 1 self.queue.append(data[i]) self.topright -= 1 print("入队完毕,队列:%s,队头topleft->%d,队尾topright->%d" %(self.queue, self.topleft, self.topright)) return self.queue def pop(self,data): self.queue = data while True: if self.topleft == self.topright: print("出队元素:%d,队尾topleft->%d" %(data[self.topleft], self.topleft)) self.queue.pop(0) print("出队完毕") break else: print("出队元素:%d,队尾topright->%d" %(data[self.topleft], self.topright)) self.queue.pop(0) self.topright -= 1 data = [] lenth = input("请输入data的长度:") for i in range(lenth): x = input() data.append(x) print("data:%s" %data) s = Queue() queue = s.push(data) s.pop(queue)
对队列的理解就是打子弹,先按进弹夹的子弹会先打出来,采取“先进先出”策略,即先进队列的成员应该先出队。
队列这里有一点需要特别注意!!
队列出队默认是最先进来的那个元素,假设queue[0] = A这个元素出队了,那么原本queue[1] = B这个元素自动←移一个单位变成queue[0] =B,因此我们每次出队的时候只需要出queue[0]这个元素就行了,每出一次,队尾topright都要减一左移一个单位,目的是判断什么时候队列空了。