栈和队列
一、栈
1.栈的定义
栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
实现栈的顺序存储结构(常用)
#栈的顺序存储结构
class SeqStack(object):
def __init__(self,size):
self.data = list(None for _ in range(size))
self.max_size = size
self.top = -1
def get_length(self):
return self.top + 1
def push(self,elem):
#进栈
if self.top + 1 == self.max_size:
raise IndexError('Stack is full')
else:
self.top += 1
self.data[self.top] = elem
def pop(self):
#出栈
if self.top == -1:
raise IndexError('Stack is empty')
else:
self.top -= 1
return self.data[self.top + 1]
def get_top(self):
if self.top == -1:
raise IndexError("Stack is empty")
else:
return self.data[self.top]
def show_stack(self):
j = self.top
while j >= 0:
print(self.data[j])
j -= 1
def is_empty_stack(self):
return self.top == -1
if __name__ == '__main__':
s = SeqStack(10)
s.push(11)
s.push(22)
s.push(33)
s.show_stack()
print('===========')
print(s.get_top())
print(s.get_length())
实现栈的链式存储结构
#栈的链式存储结构
class Node(object):
def __init__(self,data=None):
self.data = data
self.next = None
class LKStack(object):
def __init__(self):
self.top = Node(None)
self.count = 0
def get_length(self):
return self.count
def get_top(self):
return self.top.data
def is_empty(self):
return self.count == 0
def push(self,elem):
tmp = Node(elem)
if self.is_empty():
self.top = tmp
else:
tmp.next = self.top
self.top = tmp
self.count += 1
def pop(self):
if self.is_empty():
raise IndexError('Stack is empty')
else:
self.count -= 1
elem = self.top.data
self.top = self.top.next
return elem
def show_stack(self):
if self.is_empty():
raise IndexError('Satck is empty')
else:
j = self.count
tmp = self.top
while j > 0 and tmp:
print(tmp.data)
tmp = tmp.next
j -= 1
if __name__ == '__main__':
s = LKStack()
s.push(11)
s.push(22)
s.push(33)
s.push(44)
s.show_stack()
print('================')
print(s.get_length())
s.pop()
print(s.get_top())
二、队列
定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
链表实现队列:头部删除和查看O(1),尾部删除O(1)
#链表实现队列
class Node(object):
def __init__(self,elem=None):
self.next = None
self.elem = elem
class Queue(object):
def __init__(self):
self.head = None
self.rear = None
def isEmpty(self):
return self.head is None
def peek(self):
if self.isEmpty():
return None
return self.head.elem
def enqueue(self,elem):
n = Node(elem)
if self.head == None:
self.head = n
self.rear = self.head
else:
self.rear.next = n
self.rear = n
def dequeue(self):
if self.head == None:
return None
else:
tmp = self.head.elem
self.head = self.head.next
return tmp
def allDequeue(self):
List = []
while self.head != None:
List.append(self.head.elem)
self.head = self.head.next
return List
if __name__ == '__main__':
q = Queue()
q.enqueue(11)
q.enqueue(13)
q.enqueue(14)
q.enqueue(15)
print(q.peek())
print(q.dequeue())
print(q.allDequeue())