数据结构与算法——链队列

总结链队列

什么是链队?

队列的链式存储结构称为链队列。链队也有两个指针,队头指针和队尾指针,这样队头删除和队尾插入操作就会很方便,链式队列一般像单链表一样,有一个头结点。

图示:

具体实现:

<span style="font-family:Courier New;font-size:14px;">#include <iostream>

using namespace std;
template <class T>
struct Node {
    T data;
    struct Node<T> *next;
};

template<class T>
class LinkQueue {
private:
    Node<T> *front;  //队头指针
    Node<T> *rear;   //队尾指针
public:
    LinkQueue() {
        front = rear = new Node<T>;  //建立头结点 使其队头指针、队尾指针均指向该头结点
        front->next = NULL;
    }
    ~LinkQueue();
    void EnQueue(T x);   //入队
    T DeQueue();         //出队
    T GetFront();        //得到队头元素
    bool IsEmpty() {    //判断队列是否为空
        return front==rear?true:false;
    }
    void Print();       //遍历队列
};

template <class T>
void LinkQueue<T>::EnQueue(T x) {
    rear->next = new Node<T>;
    rear = rear->next;
    rear->data = x;
    rear->next = NULL;
}

template<class T>
void LinkQueue<T>::Print() {
    if(IsEmpty()) throw "空队列异常";
    Node<T> *s = front->next;  //工作指针 指向第一个结点
    while(s) {
        cout<<s->data<<" ";
        s= s->next;
    }
    cout<<endl;
}

/**
    析构函数 释放节点空间
    此处实现的方式是 从头结点开始挨个释放
    先将要释放结点的下一个节点地址赋值给一个指针,
    因为是有尾指针,所有直接可用尾指针,否则应该有一个临时工作指针
    然后释放该结点,再使头指针指向释放掉的结点的后继结点,循环执行。
*/
template <class T>
LinkQueue<T>::~LinkQueue() {
    while(front) {
        rear = front->next;
        delete front;
        front =rear;
    }
}

template <class T>
T LinkQueue<T>::DeQueue() {
    Node<T> *s = front->next;  //保存队头元素指针
    if(!s) throw "下溢异常";
    front->next = s->next;    //将队头出栈
    T x = s->data;           //保存队头元素
    delete s;
    if(!(front->next))  //若出队后 队列为空,则修改队尾指针 指向头结点
       rear = front;
    return x;
}

template <class T>
T LinkQueue<T>::GetFront() {
    if(IsEmpty()) throw "队空异常";
    return front->next->data;
}

int main()
{
    LinkQueue<int>linkQueue;
    for(int i=0;i<5;i++) {
        linkQueue.EnQueue(i);
    }
    linkQueue.Print();
    linkQueue.EnQueue(8);
    linkQueue.Print();
    cout<<"出栈"<<endl;
    cout<<linkQueue.DeQueue()<<"出栈"<<endl;
    linkQueue.Print();
    cout<<"对头元素为:"<<linkQueue.GetFront()<<endl;
    return 0;
}
</span>
时间: 2024-10-06 18:21:30

数据结构与算法——链队列的相关文章

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列

11. C#数据结构与算法 -- 顺序队列

理论基础: 队列(Queue)是插入操作限定在表的尾部而其它操作限定在表的头部进行的线性表.把进行插入操作的表尾称为队尾(Rear),把进行其它操作的头部称为队头(Front). 对列的操作是按照先进先出(First In First Out)或后进后出( Last In Last Out)的原则进行的,因此,队列又称为FIFO表或LILO表. 与栈一样,队列的运算是定义在逻辑结构层次上的,而运算的具体实现是建立在物理存储结构层次上的.因此,把队列的操作作为逻辑结构的一部分,每个操作的具体实现只

数据结构与算法之队列、栈

除了数组.链表,线性的数据结构中还有很重要的几种结构:队列.栈. 队列,一种先进先出的数据结构(FIFO),其实队列可以看成是一个两个口的管道,从一个口进,另一个口出,先进去的必定得在另一个口先出去,否则后面的都出不去:栈,一种后进先出的数据结构(LIFO),栈更像是只有一个口的管道,只有一个开口可以进出,先进去的在底部,所以必须得让后进去的先出去,它才能出去. 实现队列和栈可以用顺序存储结构,也可以用链式存储结构.这里采用的是链表来实现,同时还有用两个栈实现一个队列和用两个队列实现一个栈的算法

数据结构与算法(六)--队列

一.学习大纲 队列的定义.分类.基本方法 队列的实现代码 队列的底层实现(数组.链表) 队列的的分类:顺序队列.循环队列 二.队列 队列的定义:先进者先出的一种操作受限的线性表数据结构,它包含入队enqueue()和dequeue()两个基本的操作: 作为一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列.阻塞队列.并发队列.它们在很多偏底层系统.框架.中间件的开发中,起着关键性的作用.比如高性能队列 Disruptor.Linux 环形缓存,都用到了循

数据结构和算法-007 队列

堆栈,另一个经典的数据结构.先进先出. 直接看代码吧,实现以下功能: 创建队列 插入值 取出值 值查看当前值 顺序插入 public class TheQueue {          private String[] queueArray;          private int queueSize;          private int front, rear, numberOfItems =0;          TheQueue(int size){                

Java数据结构与算法(4) - 队列(Queue和PriorityQ)

队列: 先进先出(FIFO). 优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数据项后移.在图的最小生成树算法中应用优先级队列. 示例代码: package chap04.Queue; class Queue { private int maxSize; private long[] queArray; private int front; private int rear;

第三章 队列【数据结构】【链队列】

最近越来越感觉到c语言指针的强大~~ #include<stdio.h> #include<stdlib.h> #define QElemType int #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef int Status; //------------单链表------------队列的链式存储结构 typedef struct QNode { QElemType data; struct QNode *next;

Java数据结构与算法(3):队列

队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除. 队列模型 队列的基本操作包括入队.出队操作.在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO). 队列的数组实现 对于每一个队列数据结构,保留一个数组items以及位置front和back,分别表示队列的两端,还要记录元素的个数size.操作过程应该是:当一个元素x入队,size和back增1,置items[back]=x:出队时,返回items[front],size减1,然后front增1. 初始队列: 入队: 出队

数据结构与算法——循环队列

今天总结循环队列. 什么是队列? 队列跟栈差不多,也是一种操作受限的线性表,只允许在线性表的一端进行插入操作,在另一端进行删除操作.插入的一端称为队尾,删除的一端称为队头,插入操作称为入队,而删除操作称作出出队,不含任何数据元素的队称为空队.队列也有两种实现方式,一种就是顺序存储,用数组实现,另一种是采用链表形式.今天总结顺序存储的循环队列. 什么是循环队列? 循环队列就是,当队尾指针移动到数组末尾时,下次再有元素入队时,可以将队尾指针重新移到数组前面没有元素的位置. 为什么要使用循环队列? 循