链队列

关于此数据结构&题外话

  链队列是队列的一种,队列(Queue)是一种先入先出的数据结构。增加元素叫入队,删除元素叫出队。

  我最近发现了拿类组织数据结构真的是一件很方便的事,因此这一期用的事模板+类,有关C++的代码我都会在旁标出C语言等价解释。

链队列的示意

 

 可以看到,在入队时,将元素加入队尾。而在出队时,只需将队首元素出队就行了。但是为了防止内存泄漏就应释放出队的那一个元素。

一种特殊情况是,在队列里只有一个元素时,将该元素出队。此时就需要移动rear, 使rear = front,否则之后在判空时会出错。如图所示


 

链队列应实现的功能如下

template <typename ElementType>
class LinkQueue
{
private:
    Node<ElementType> *front; //相当于Node的数据域类型为ElementType
    Node<ElementType> *rear;

public:
    bool initQueue();                 //初始化队列
    bool isEmpty();                   //队列判空
    bool enterQueue(ElementType x);   //入队
    bool deleteQueue(ElementType *x); //出队
    bool getHead(ElementType *x);     //得到元素,但不出队
    void clearQueue();                //清空队列
};

链队列的实现

注释都在代码里,不懂请发私信或直接联系我QQ也行。

#include <iostream>

template <typename ElementType> //相当于#define ElementType 元素类型
struct Node
{
    ElementType data; //数据域
    Node *next;       //指针域
};

template <typename ElementType>
class LinkQueue
{
private:
    Node<ElementType> *front; //相当于Node的数据域类型为ElementType
    Node<ElementType> *rear;

public:
    bool initQueue();                 //初始化队列
    bool isEmpty();                   //队列判空
    bool enterQueue(ElementType x);   //入队
    bool deleteQueue(ElementType *x); //出队
    bool getHead(ElementType *x);     //得到元素,但不出队
    void clearQueue();                //清空队列
};

template <typename ElementType>
bool LinkQueue<ElementType>::initQueue()
{
    try //相当于front = (Node*)malloc(sizeof(Node))
    {
        front = new Node<ElementType>;
    }
    catch (const std::exception &e)
    { //相当于if(front == NULL)
        std::cerr << e.what() << '\n';
    }
    rear = front;
    front->next = nullptr;
    return true;
}

template <typename ElementType>
bool LinkQueue<ElementType>::isEmpty()
{
    if (front == rear)
    {
        return true;
    }
    return false;
}

template <typename ElementType>
bool LinkQueue<ElementType>::enterQueue(ElementType x)
{
    Node<ElementType> *newNode;
    try
    {
        newNode = new Node<ElementType>;
    }
    catch (const std::exception &e)
    {
        std::cerr << e.what() << '\n';
    }
    newNode->data = x;
    newNode->next = nullptr;
    rear->next = newNode;
    rear = newNode;
    return true;
}

template <typename ElementType>
bool LinkQueue<ElementType>::deleteQueue(ElementType *x)
{
    Node<ElementType> *p;
    if (this->isEmpty()) //队空
    {
        return false;
    }
    p = front->next;
    *x = p->data;
    front->next = p->next;
    if (rear == p) //如果队中只有一个元素p,则p出队后成为空队
    {
        rear = front;
    }
    delete p;
    return true;
}

template <typename ElementType>
bool LinkQueue<ElementType>::getHead(ElementType *x)
{
    if (this->isEmpty())
    {
        return false;
    }
    *x = front->next->data;
    return true;
}

template <typename ElementType>
void LinkQueue<ElementType>::clearQueue()
{
    if (this->isEmpty())
    {
        return;
    }
    while (front != rear)
    {
        Node<ElementType> *p = front;
        front = front->next;
        delete p;
    }
}

int main()
{ //测试代码
    LinkQueue<int> test;
    test.initQueue();
    int testInt;
    test.enterQueue(1);
    test.enterQueue(2);
    test.enterQueue(3);
    test.getHead(&testInt);
    std::cout << testInt << std::endl;
    test.deleteQueue(&testInt);
    std::cout << testInt << std::endl;
    test.deleteQueue(&testInt);
    std::cout << testInt << std::endl;
    test.clearQueue();
    test.deleteQueue(&testInt);
    std::cout << testInt << std::endl;
}

  

posted @ 2022-03-14 21:42  帝皇の惊  阅读(92)  评论(0)    收藏  举报