天天看点

python 队列实现栈_Python实现栈、队列

本文将使用python实现数据结构中的栈、队列;有关栈、队列的理论原理请参考:《数据结构与算法》-3-栈和队列;

1. 栈的Python实现

1.1 以列表的形式简单实现栈

"""

以列表的形式简单实现栈

栈:先进后出

"""

class Stack:

def __init__(self):

self.stack = [] # 初始化

def is_empty(self):

return not bool(self.stack) # 判空

def push(self, value):

self.stack.append(value) # 入栈

return True

def pop(self):

if self.stack:

return self.stack.pop() # 出栈

else:

raise LookupError('stack is empty!')

def peek(self):

if self.stack:

return self.stack[-1] # 获取栈顶元素

else:

raise LookupError('stack is empty')

def length(self):

return len(self.stack) # 获取栈内元素个数

1.2 以单链表形式实现栈

"""

以单链表形式实现栈

栈:先进后出

"""

class Node:

def __init__(self, val=None, nxt=None):

self.value = val # 信息域

self.next = nxt # 指针域

class Stack:

# 初始化一个空栈

def __init__(self):

self._top = None # 栈顶元素

def is_empty(self):

return self._top is None

def push(self, item):

if not self._top:

self._top = Node(item) # 空栈:直接将新结点设置为栈顶元素

return True

node = self._top # 获取栈顶元素

self._top = Node(item) # 将新结点设置为栈顶元素

self._top.next = node # 将栈顶元素的指针指向原栈顶元素

return True

def pop(self):

if self.is_empty():

raise LookupError('stack is empty!')

node = self._top # 获取栈顶元素

self._top = self._top.next # 将原栈顶元素的下一个元素设置为栈顶元素

return node.value # 返回原栈顶元素的信息域

def peek(self):

if self.is_empty():

raise LookupError('stack is empty!')

node = self._top # 获取栈顶元素

return node.value # 返回栈顶元素的信息域

def length(self):

if self.is_empty():

return 0

node = self._top # 获取栈顶元素

count = 1 # 计数

while node.next: # 栈顶元素的下一个元素,直到初始None

node = node.next

count += 1

return count

def stack_to_list(self):

if self.is_empty():

return []

node = self._top # 获取栈顶元素

li = [node.value]

while node.next:

node = node.next

li.append(node.value)

return li[::-1] # 按照进栈的顺序,先后在列表中排列

2. 队列的Python实现

2.1 以列表实现简单队列

"""

以列表的形式简单实现队列

队列:先进先出

"""

class Queue:

def __init__(self):

self.li = []

def is_empty(self):

return not bool(self.li)

def enqueue(self, items):

self.li.append(items)

return True

def dequeue(self):

if self.is_empty():

raise LookupError('queue is empty!')

return self.li.pop(0)

def length(self):

return len(self.li)

def show(self):

if self.is_empty():

raise LookupError('queue is empty!')

return self.li

2.2 以单链表形式实现队列

"""

以链表的形式实现队列

"""

class Node:

def __init__(self, val=None, nxt=None):

self.value = val # 数据域

self.next = nxt # 指针域

class Queue:

def __init__(self):

self.first = None # 头指针,指向队头结点

self.last = None # 尾指针,指向队尾结点

self.size = 0 # 表示队列内的结点数

def is_empty(self):

return self.first is None # 判空

def enqueue(self, items):

node = Node(items) # 创建新结点

self.size += 1 # 结点个数加1

if self.is_empty():

self.first = self.last = node # 加入第一个结点

return True

self.last.next = node # 队尾结点的指针域指向新结点

self.last = node # 尾指针指向队尾结点

return True

def dequeue(self):

if self.is_empty():

raise LookupError('queue is empty!')

node = self.first # 需要返回的队头结点

self.first = node.next # 队头指针指向新队头结点

self.size -= 1

return node.value

def length(self):

return self.size

def queue_to_list(self):

if self.is_empty(): # 判空

return []

first_ = self.first

node = self.first

li = [node.value]

while node.next:

node = node.next

li.append(node.value)

return li # 按照的进队列的顺序,在列表中排列