以下のためのコード - ストレージ構造循環キュー:第五|データ構造とアルゴリズムベースのPython


時間的に、我々は、引き継ぐような数学的手法によって順次格納されている円形のキューを実現します。私たちは基礎となるよう内蔵のPythonのリスト型を使用しているので、実際には、私たちの収納スペースには、端部に接続された終わりではありません。ここで、我々は最後まで本当の終わりを格納円形キューを達成するために鎖構造を使用します。


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

テスト:

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)

結果:

队首元素: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: 队列已满,无法入队。

公開された16元の記事 ウォンの賞賛0 ビュー641

おすすめ

転載: blog.csdn.net/weixin_43628432/article/details/103947450