数据结构基础(14) --链式队列的设计与实现

链式队列是基于单链表的一种存储表示, 其形状如下图所示:

(队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点)

用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况;

链式队列结点构造:

[这次我们将节点构造成了类LinkQueue的嵌套类]

struct ChainNode
{
    ChainNode(const Type &_data, ChainNode *_next = NULL)
        :data(_data), next(_next) {}

    Type data;
    ChainNode *next;
};

链式队列构造:

template <typename Type>
class LinkQueue
{
    template <typename T>
    friend ostream &operator<<(ostream &os, LinkQueue<T> &queue);
public:
    LinkQueue();
    ~LinkQueue();
    bool isEmpty() const;

    void push(const Type &data);
    void pop();

    //返回队首元素
    const Type &front() const;
    //返回队尾元素
    const Type &back() const;
    //清空队列
    void makeEmpty();

private:
    struct ChainNode
    {
        ChainNode(const Type &_data, ChainNode *_next = NULL)
            :data(_data), next(_next) {}

        Type data;
        ChainNode *next;
    };

private:
    ChainNode *m_front; //队首指针[注意不是指向一个无用的空节点]
    ChainNode *m_back;  //队尾指针[注意不是指向一个无用的空节点]
};

队列的构造与析构:

template <typename Type>
LinkQueue<Type>::LinkQueue()
{
    m_front = m_back = NULL;
}
template <typename Type>
LinkQueue<Type>::~LinkQueue()
{
    makeEmpty();
}

队列的四大操作:

//入队, 这是链式队列的关键
template <typename Type>
void LinkQueue<Type>::push(const Type &data)
{
    if (isEmpty())
    {
        //如果队列为空
        //则队首与队尾指针共同指向一个新构造的对象
        m_front = m_back = new ChainNode(data);
    }
    else
    {
        //首先让队尾的下一位置指向一个新构造的对象
        m_back->next = new ChainNode(data);
        //然后队尾指针后移
        m_back = m_back->next;
    }
}
//出队
template <typename Type>
void LinkQueue<Type>::pop()
{
    if (isEmpty())
        throw std::range_error("queue is empty");

    ChainNode *deleteNode = m_front;
    // 队首指针后移
    m_front = m_front->next;
    delete deleteNode;
}
//取队首元素
template <typename Type>
const Type &LinkQueue<Type>::front() const
{
    if (isEmpty())
        throw std::range_error("queue is empty");

    return (m_front->data);
}
//取队尾元素
template <typename Type>
const Type &LinkQueue<Type>::back() const
{
    if (isEmpty())
        throw std::range_error("queue is empty");

    return (m_back->data);
}

清空队列与判空操作:

template <typename Type>
void LinkQueue<Type>::makeEmpty()
{
    while (!isEmpty())
    {
        pop();
    }
}
template <typename Type>
bool LinkQueue<Type>::isEmpty() const
{
    return (m_front == NULL);
}

输出队列所有元素(以做测试):

template <typename Type>
ostream &operator<<(ostream &os, LinkQueue<Type> &queue)
{
    for (typename LinkQueue<Type>::ChainNode *currentNode = queue.m_front;
            currentNode != NULL;
            currentNode = currentNode->next)
    {
        os << currentNode->data << ‘ ‘;
    }

    return os;
}

附-测试代码:

int main()
{
    LinkQueue<int> queue;
    for (int i = 0; i < 10; ++i)
    {
        queue.push(rand()%100);
    }
    cout << queue << endl;

    cout << queue.front() << endl;
    queue.pop();
    cout << queue.front() << endl;
    cout << queue.back() << endl;
    cout << queue << endl;

    LinkQueue<char> cQueue;
    cQueue.push(‘A‘);
    cout << "cQueue.front = " << cQueue.front() << endl;
    cout << "cQueue.back = " << cQueue.back() << endl;
    cQueue.pop();
    cout << cQueue << endl;
    try
    {
        cout << "cQueue.front = " << cQueue.front() << endl;
        cout << "cQueue.back = " << cQueue.back() << endl;
    }
    catch(const std::exception &e)
    {
        cerr << e.what() << endl;
    }

    return 0;
}
时间: 2024-10-06 08:43:57

数据结构基础(14) --链式队列的设计与实现的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

数据结构之---C语言实现链式队列

//链式队列的存储 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef int QElemType; //定义节点 typedef struct QNode { QElemType data; struct QNode *next; }QNode, *QueuePtr; //定义指针 typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; //插入元素e进入队列 vo

【数据结构-队列】链式队列

关于链式队列 链式队列又称为链队,是使用单链表实现的,需要一个头指针一个尾指针 结构图: 链队需要的元素组成 /*链式队列的每一个节点*/ struct node{ int data;//存储数据 struct node *next;//指向下一个节点的指针 }; /*链式队列*/ typedef struct{ struct node *head;//头指针 struct node *tail;//尾指针 }LinkedQueue; 创建一个带头节点的空队列 创建一个节点p 将p节点的next

链式队列总结

基本数据结构之-链式队列 链式队列就是一个操作受到限制的单链表,学会了单链表再来写这个就是轻松加愉快,但是貌似我去用了两个小时搞定,主要是基础差! 队列的基本操作就是入栈和出栈,还可以看到对头和对尾 如果维护了长度参数,那么也可以返回一个长度 不说理论了,直接上代码吧! 首先定义基本数据结构的结构体: typedef struct _LINKQUEUENODE { struct _LINKQUEUENODE *next; }LinkQueueNode; typedef struct _LINKQ

有序链式队列

  编写头文件 struct queue { int num;            //代表数据 int high;           //优先级1111 struct queue *pNext;//存储下一个节点的地址 }; typedef  struct queue Queue;                           //简化队列 Queue * init(Queue *queueHead);                        //初始化 Queue *

链式队列的实现

链式队列数据结构如下: typedef struct qnode{ ElemType data; struct qnode* next; //指向下一节点指针 }QNode; typedef struct{ QNode* front; //队首指针 QNode* rear; //队尾指针 }ListQueue; 实现以下函数: void InitQueue(ListQueue* &q); //初始化队列 void ClearQueue(ListQueue* &q); //清空队列 int

顺序队列和链式队列的实现

队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据.队列跟栈不同,栈是一种"后进先出"的模式,而队列是一种"先进先出"的操作模式.就好比日常排队一样,先排队的先出,后排队的后出.例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况). 队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现. 顺序队列: //顺序队列 #include

链式队列(Linked Queue)

链式队列(Linked Queue) 1. 链式队列的概念 1.1 链式队列的定义 链式队列是基于链表的存储表示实现的队列. 1.2 链式队列中各元素的逻辑及存储关系 链式队列可以采用单链表作为其存储表示,因此,可以在链式队列的声明中用单链表定义它的存储空间. 链式队列的队头指针指向单链表的第一个结点,队尾指针指向单链表的最后一个结点. 注:链式队列的队头元素存放在单链表的第一个结点内,若要从队列中退出一个元素,必须从单链表中删去第一个结点,而存放着新元素的结点应插在队列的队尾,即单链表的最后一

链式队列的C++实现

链式队列的C++实现 一.数据结构 struct QNode //定义队列结点的数据结构 { QNode *next; //指针域,指向下一个结点 double data; //数据域,存储队列信息 }; struct LinkQueue //定义队列的数据结构 { QNode *front; //队首指针,指向QNode类型的指针 QNode *rear; //队尾指针 }; void InitQueue(LinkQueue &Q) //构造一个空的队列 int IsEmpty(LinkQue