队列的链表实现

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/48655805 队列的链表...
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/48655805

队列的链表实现代码(在这做一下记录):

//============================================================================
// Name        : LinkedQueue.cpp
// Author      : 陈洪波
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include "Exception.h"
#include <iostream>
using namespace std;

template<class T>
class Node;

template<class T>
class LinkedQueue {
public:
    LinkedQueue() {
        front = rear = 0;
    }
    ~LinkedQueue();
    bool IsEmpty() const {
        return ((front) ? false : true);
    }
    bool IsFull() const;
    T First() const;
    T Last() const;
    LinkedQueue<T>& Add(const T& x);
    LinkedQueue<T>& Delete(T& x);
    void Output(ostream& out) const;
    int Size() const;
private:
    Node<T>* front;
    Node<T>* rear;
};

template<class T>
class Node {
    friend class LinkedQueue<T> ;
private:
    T data;
    Node<T> *link;
};

template<class T>
LinkedQueue<T>::~LinkedQueue() {
    Node<T> *next;

    while (front) {
        next = front->link;
        delete front;
        front = next;
    }
}

template<class T>
bool LinkedQueue<T>::IsFull() const {
    Node<T> *p;

    try {
        p = new Node<T>;
        delete p;
        return false;
    } catch (NoMem) {
        return true;
    }
}

template<class T>
T LinkedQueue<T>::First() const {
    if (IsEmpty())
        throw OutOfBounds();

    return front->data;
}

template<class T>
T LinkedQueue<T>::Last() const {
    if (IsEmpty())
        throw OutOfBounds();

    return rear->data;
}

template<class T>
LinkedQueue<T>& LinkedQueue<T>::Add(const T& x) {
    if (IsFull())
        throw NoMem();

    Node<T> *next = new Node<T>;
    next->data = x;
    next->link = 0;

    if (front){
        rear->link = next;
        rear = next;
    }else {
        front = next;
        rear = next;
    }

    return *this;
}

template<class T>
LinkedQueue<T>& LinkedQueue<T>::Delete(T& x) {
    if (IsEmpty())
        throw OutOfBounds();

    x = front->data;

    Node<T>* p = front;
    front = front->link;
    delete p;

    return *this;
}

template<class T>
void LinkedQueue<T>::Output(ostream& out) const {
    Node<T>* p = front;

    while (p) {
        cout << p->data << " ";
        p = p->link;
    }

    cout << endl;
}

template<class T>
ostream& operator<<(ostream& out, const LinkedQueue<T>& x) {
    x.Output(out);

    return out;
}

template<class T>
int LinkedQueue<T>::Size() const{
    int count = 0;

    if(IsEmpty())
        return 0;

    Node<T>* p = front;
    while(p){
        count++;
        p = p->link;
    }

    return count;
}

int main() {
    LinkedQueue<int> lq;
    lq.Add(1);
    lq.Add(2);
    lq.Add(3);
    lq.Add(4);
    lq.Add(5);

    cout << lq << endl;

    return 0;
}
目录
相关文章
|
6月前
|
C++
数据结构01-线性结构-链表栈队列-栈篇
数据结构01-线性结构-链表栈队列-栈篇
|
6月前
|
Python
Python实现数据结构(如:链表、栈、队列等)。
Python实现数据结构(如:链表、栈、队列等)。
277 0
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
93 64
|
5月前
|
数据安全/隐私保护
第2章 栈、队列、链表
第2章 栈、队列、链表
|
6月前
|
算法 测试技术
【数据结构与算法 | 基础篇】单向循环链表实现队列
【数据结构与算法 | 基础篇】单向循环链表实现队列
|
6月前
|
存储
线性表、链表、栈和队列的初始化
线性表、链表、栈和队列的初始化
38 1
|
6月前
|
存储 调度 C语言
链表,栈,队列的区别及其应用
链表,栈,队列的区别及其应用
|
6月前
数据结构 模拟实现Queue队列(双链表模拟)
数据结构 模拟实现Queue队列(双链表模拟)
51 1
|
6月前
|
Go Python 算法
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
767 0
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
|
6月前
|
存储 数据安全/隐私保护 C++
数据结构01-线性结构-链表栈队列-队列篇
数据结构01-线性结构-链表栈队列-队列篇