📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 43(1)

📅  最后修改于: 2023-12-03 15:23:03.633000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2014 |问题 43

该问题需要我们实现一个基于链表的队列数据结构,具有入队、出队、打印队列元素等基本操作。

问题描述

下面是原问题描述:

Implement a Queue using Linked List and make it Circular Queue.

For Detailed problem statement, refer ISRO: CS 2014 question 43

根据问题描述,我们需要实现一个队列数据结构,使用链表来实现,并且需要具有循环队列的特性。

思路分析

为了实现基于链表的队列,我们可以使用链表节点来表示队列的元素,每个节点保存一个数据值和指向下一个元素的指针。同时,使用头指针(指向队头)和尾指针(指向队尾)来标识队列的位置。

对于循环队列,我们需要处理队列满和队列空的情况。队列满的条件是队尾的下一个位置为队头,因为队列是循环的。队列空的条件是头指针等于尾指针。

代码实现

下面是使用 Python 语言实现的带有循环队列特性的链表队列:

class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

class QueueUsingLinkedList:
    def __init__(self):
        self.front = None
        self.rear = None

    def is_empty(self):
        return self.front is None
    
    def enqueue(self, item):
        new_node = Node(item)
        if self.is_empty():
            self.front = self.rear = new_node
        else:
            self.rear.next = new_node
            self.rear = new_node
        self.rear.next = self.front
    
    def dequeue(self):
        if self.is_empty():
            raise Exception("Queue is empty!")
        item = self.front.data
        if self.front == self.rear:
            self.front = self.rear = None
        else:
            self.front = self.front.next
            self.rear.next = self.front
        return item
    
    def print_queue(self):
        if self.is_empty():
            print("Queue is empty!")
        else:
            curr_node = self.front
            while curr_node.next != self.front:
                print(curr_node.data, end=" ")
                curr_node = curr_node.next
            print(curr_node.data)
测试例子

我们可以使用以下代码来测试我们的实现:

q = QueueUsingLinkedList()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)
q.print_queue() # 1 2 3 4
q.dequeue()
q.print_queue() # 2 3 4
q.enqueue(5)
q.enqueue(6)
q.print_queue() # 2 3 4 5 6