Data Structures and Algorithms based Python | fifth: code for - Storage Structure circular queue


In time, we realized the circular queue stored sequentially by mathematical methods such as taking over. Since we are using the built-in Python list type as the underlying, in fact, our storage space is not connected end to end. Here, we use the chain structure to achieve circular queue storing a real end to end:


class Node(object):
	'定义节点。'

	def __init__(self):
		'初始化:数据域与指针域。'

		self.data = None
		self.next = None

class Queue(object):
	'定义循环链表。'

	def __init__(self,MaxSize):
		'初始化:建立链式存储空间。'

		self.MaxSize = MaxSize
		self.size = 0
		self.front = None
		self.rear = None
		self.OpenSpace()

	def OpenSpace(self):
		'方法:用于初始化。'

		node = Node()
		self.front = node
		self.rear = node    #创建第一个节点,将队头指针与队尾指针指向它。

		for i in range(self.MaxSize - 1):
			node = Node()
			self.front.next = node
			self.front = node    #通过移动队头指针将剩下的节点依次创建并连接。

		self.front.next = self.rear
		self.front = self.rear    #利用队头指针与队尾指针将所有节点连接成环。


	def IsEmpty(self):
		'方法:判断是否为空队列。'

		if self.size == 0:
			return True
		else:
			return False

	def IsFull(self):
		'方法:判断是否为满队列。'

		if self.size == self.MaxSize:
			return True
		else:
			return False

	def GetSize(self):
		'方法:得到队列长度。'

		return self.size

	def push(self,data):
		'方法:进队。'

		if self.IsFull():
			raise IndexError('队列已满,无法入队。')
		else:
			self.rear.next.data = data
			self.rear = self.rear.next
			self.size += 1

	def pop(self):
		'方法:出队。'

		if self.IsEmpty():
			raise IndexError('队列已空,无法出队。')
		else:
			self.front.data = None
			self.front = self.front.next
			self.size -= 1

	def GetFrontData(self):
		'方法:得到队首元素。'

		return self.front.data

	def GetRearData(self):
		'方法:得到队尾元素。'

		return self.rear.data

test:

my_queue = Queue(10)

for i in range(5):
	my_queue.push(i + 1)
	print('队首元素:{}'.format(my_queue.GetFrontData()))
	print('队尾元素:{}'.format(my_queue.GetRearData()))

print('\n')
for i in range(3):
	my_queue.pop()
	print('队首元素:{}'.format(my_queue.GetFrontData()))
	print('队尾元素:{}'.format(my_queue.GetRearData()))

print('\n')
for i in range(5,5 + 8):
	my_queue.push(i + 1)
	print('队首元素:{}'.format(my_queue.GetFrontData()))
	print('队尾元素:{}'.format(my_queue.GetRearData()))

my_queue.push(0)

result:

队首元素:1
队尾元素:1
队首元素:1
队尾元素:2
队首元素:1
队尾元素:3
队首元素:1
队尾元素:4
队首元素:1
队尾元素:5


队首元素:2
队尾元素:5
队首元素:3
队尾元素:5
队首元素:4
队尾元素:5


队首元素:4
队尾元素:6
队首元素:4
队尾元素:7
队首元素:4
队尾元素:8
队首元素:4
队尾元素:9
队首元素:4
队尾元素:10
队首元素:4
队尾元素:11
队首元素:4
队尾元素:12
队首元素:4
队尾元素:13
Traceback (most recent call last):
  File "带链的队列.py", line 112, in <module>
    my_queue.push(0)
  File "带链的队列.py", line 63, in push
    raise IndexError('队列已满,无法入队。')
IndexError: 队列已满,无法入队。

Published 16 original articles · won praise 0 · Views 641

Guess you like

Origin blog.csdn.net/weixin_43628432/article/details/103947450