#!/usr/bin/env python
# encoding: utf-8
import os
'''
Python程序员面试算法宝典---解题总结: 第2章 栈、队列与哈希 2.2 如何实现队列
题目:
实现一个队列的数据结构,使其具有入队列、出队列、查看队列首尾元素、查看队列大小等功能
分析:
队列的特点就是先进先出。
这里最关键的一点就是查看队列首尾元素。
栈和队列实际都是链表的变体。
这里可以考虑用双向链表。
采用尾插法,设置一个头结点,头结点存储队列长度信息。
记录当前节点的前一个节点,即为prev, 每次待插入的节点记为curr,
初始令:
prev = head
tail = head
进队操作:
prev.nextNode = curr
curr.prevNode = prev
prev = curr
tail = prev
那么查看队列的首元素就是获取: head.nextNode
查看队列的尾元素就是获取: tail
出队操作,则需要将链表的第一个节点删除:
head.nextNode = head.nextNode.nextNode
关键:
1 可以用单向链表实现
只是要查看队尾元素,可以记录一个尾指针
2 可以用数组实现
设置front指向第一个元素,设置rear初始为front后面的一个元素,
进队: list[rear] = newData, read += 1
出队: front += 1
后面可以用循环数组实现
两种方法更推荐用单向链表
参考:
Python程序员面试算法宝典
'''
class Node(object):
def __init__(self, data=None, nextNode=None, prevNode=None):
self.data = data
self.nextNode = nextNode
self.prevNode = prevNode
def buildList(arr):
if not arr:
return
head = Node()
current = head
for data in arr:
newNode = Node(data)
current.nextNode = newNode
current = newNode
return head
def printList(head):
if not head:
return
if not head.nextNode:
return
current = head.nextNode
result = ""
while current:
if "" == result:
result += str(current.data)
else:
result += "->" + str(current.data)
current = current.nextNode
print result
class MyQueue(object):
def __init__(self):
self.head = Node()
self.prev = self.head
self.tail = None
self.len = 0
def getLen(self):
return self.len
def isEmpty(self):
if self.len <= 0:
return True
else:
return False
def push(self, data):
curr = Node(data)
self.prev.nextNode = curr
curr.prevNode = self.prev
self.prev = curr
self.tail = self.prev
self.len += 1
def pop(self):
if self.isEmpty():
print "queue is empty, it can not pop"
return
temp = self.head.nextNode
self.len -= 1
self.head.nextNode = self.head.nextNode.nextNode if self.head.nextNode else None
return temp.data
def getHead(self):
if self.isEmpty():
print "queue is empty, it can not get head"
return None
return self.head.nextNode.data
def getTail(self):
if self.isEmpty():
print "queue is empty, it can not get head"
return None
else:
return self.tail.data
def process():
myqueue = MyQueue()
[myqueue.push(i) for i in range(1, 7)]
for i in range(1, 8):
result = myqueue.pop()
print "value: {result}".format(result=result)
print "queue length: {length}".format(length=myqueue.getLen())
if __name__ == "__main__":
process()