python用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针),实现该队列的入队出队以及判断队列是否为空操作
时间: 2024-10-22 14:11:47 浏览: 41
在Python中,使用带头结点的循环链表表示队列,仅保留一个指针`tail`指向队尾元素,而不设立专门的头指针,可以简化实现,但会增加一些操作的复杂性。这是因为当我们需要访问队首元素时,需要从队尾开始向前遍历直到找到第一个元素。以下是基本的实现步骤:
1. 定义一个`Node`类,用于存储链表节点,包含数据和指向下一个节点的引用。
2. 创建一个`CircularQueue`类,维护一个`tail`指针,代表队尾元素。
- 初始化函数`__init__`设置初始状态为空队列。
- `enqueue`方法用于入队,将新节点作为新的队尾,然后更新`tail`。
- `dequeue`方法用于出队,从当前队尾开始遍历到队首元素,删除之并返回值,同时处理尾指针更新。
- `is_empty`方法检查队列是否为空,即`tail`是否为None。
- `size`方法计算队列大小,通过遍历到队首再回溯到队尾计数。
下面是一个简单的实现例子:
```python
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
class CircularQueue:
def __init__(self):
self.tail = Node() # 带头结点的循环链表
def enqueue(self, item):
new_node = Node(item)
if not self.is_empty():
current_tail = self.tail
while current_tail.next != self.tail:
current_tail = current_tail.next
current_tail.next = new_node
else:
new_node.next = self.tail
self.tail = new_node
def dequeue(self):
if self.is_empty():
raise Exception("Queue is empty")
else:
if self.tail.next == self.tail:
self.tail = None
else:
current_tail = self.tail
while current_tail.next != self.tail:
current_tail = current_tail.next
current_tail.next = self.tail.next
return self.tail.data
def is_empty(self):
return self.tail == None
def size(self):
count = 0
current = self.tail.next
while current != self.tail:
count += 1
current = current.next
return count
# 示例
cq = CircularQueue()
cq.enqueue(1)
cq.enqueue(2)
print(cq.dequeue()) # 输出:1
```
阅读全文