栈和队列是两种基本的数据结构,同为容器类型。两者区别如下:
stack: 后进先出
![e66cc10609c4024accf68a3054b51969.png](https://img-blog.csdnimg.cn/img_convert/e66cc10609c4024accf68a3054b51969.png)
queue:先进先出
![5509b25731f8bd81e7d2d3c7830a274f.png](https://img-blog.csdnimg.cn/img_convert/5509b25731f8bd81e7d2d3c7830a274f.png)
Note: stack 和 queue 是不能通过查询具体某一个位置的元素而进行操作的。但是他们的排列是按顺序的。对于stack我们可以使用python内置的list实现,因为list属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1),这非常符合stack的要求。当然也可以使用列表来实现。stack的实现代码(使用python内置的list),实现简单,代码如下:
class Stack(object):
def __init__(self):
self.stack = []
def push(self,value): #进栈
self.stack.append(value)
def pop(self): #出栈
if self.stack:
self.stack.pop()
else:
raise LookupError('stack is empty') #无效数据查询
def is_empty(self): ##判断栈是否为空
return bool(self.stack)
def top(self): #取出栈中最新的元素
return self.stack[-1]
我们定义如下的链表来实现队列数据结构
![a81c67f21c745dbe7e07f79b482e0c99.png](https://img-blog.csdnimg.cn/img_convert/a81c67f21c745dbe7e07f79b482e0c99.png)
定义一个头节点,左边指向队列的开头,右边指向队列的末尾,这样就可以保证我们插入一个元素和取出一个元素都是O(1)的操作,使用这种链表实现queue也是非常的方便,代码实现如下:
class Head(object):
def __init__(self):
self.left = None
self.right = None
def Node(object):
def __init__(self,value):
self.value = value
self.next = None
class queue(object):
def __init__(self):
#初始化节点
self.head = Head()
def enqueue(self,value):
#插入一个元素
newnode = Node(value)
p = self.head
if p.right:
#如果head节点的右边不为None,
#说明队列中有其他元素
temp = p.right
temp.next = newnode
p.right = newnode
else:
#此时说明队列为空
p.right = newnode
p.left = newnode
def dequeue(self):
#取出一个元素
p = self.head
if p.left and (p.left == p.right):
#说明队中只有一个元素
temp = p.left
p.left = p.right = None
return temp.value
elif p.left and (p.left != p.right):
#说明队中不只一个元素
temp = p.left
p.left = temp.next
return temp.value
else:
#说明队列为空
raise LookupError('queue is empty!')
def is_empty(self):
if self.head.left:
return False
else:
return True
def top(self):
#查询队列中最先入队的元素
if self.head.left:
return self.head.left.value
else:
raise LookupError('queue is empty!')