数据结构5_链队列

本文用指针形式实现了先进先出的队列,与栈队列类似,需要设计一个队列节点类,一个队列类,

同时队列类为节点类的友元函数;不过与链栈不同的是,链栈仅用单一指针来实现入栈和出栈

而链队列需要有front和rear两个指针(皆为队列节点类指针),front指针负责处理出列,rear处理入列

#include<iostream>
using namespace std;
class LinkQueue;
class QNode   //每个节点的类
{
    char *data;  
 //每个节点的数据类型
    QNode *next;   //QNode指针,指向下一个节点
    friend
class LinkQueue;
};
class
LinkQueue
{
    QNode *front;//队头指针
    QNode *rear;//队尾指针
public:
    LinkQueue()//构造一个新的队列,
    {
   
    front=rear=NULL;//想把队头和队尾指针置为无,否则if语句中!front判定将始终为1
   
    front=rear=new
QNode;
        if(!front)
       
{
            cout<<"OVERFLOW"<<endl;
       
    return;
       
}
        front->next=NULL;
    
        cout<<"the queue is constructed"<<endl;
   
}
    void EnQueue(char *e)//插入队尾,
   
{
        QNode *p=new QNode;//分配一个队列节点空间,
       
if(!p)
       
{
            cout<<"OVERFLOW"<<endl;
       
    return;
       
}
        p->data=new
char(sizeof(e)+1);
       
strcpy(p->data,e);
       
p->next=NULL;
   
    rear->next=p;  
 //队尾节点的next指针指向p
   
    rear=p;   
        //队尾节点指向p
    }
   
bool QueueEmpty()
   
{
        if (front==rear)
       
    return true;
   
    else
       
    return false;
   
}
    void DeQueue(char *&e)//队头出列
    {
   
    if(QueueEmpty()) //空队列报错
       
{
            cout<<"error"<<endl;
       
    return;
       
}
        QNode *p=front->next;
        e=new char(sizeof(p->data)+1);
   
    strcpy(e,p->data);
       
front->next=p->next;
        if(rear==p)  
   //队列只有一个节点的情况
   
        rear=front;
        delete p;
   
}
    void QueueClear()
  //队列清空
   
{
       
   
    QNode *p;
   
    while(!QueueEmpty())
  //队列非空时执行
   
    {
           
p=front->next;
   
        front->next=p->next;
       
    if(rear==p)
     //队列只有一个节点的情况
       
        rear=front;
       
    delete
p;
        }
   
    cout<<"all
cleared"<<endl;
   
}
    int QueueLength()
  //统计队列长度
   
{
        if(QueueEmpty())
   
        return
0;
        else
       
{
            QNode *p=front->next;
       
    int length=1;
       
    while(p!=rear)
   
        {
       
        length++;
       
        p=p->next;
       
    }
           
return length;

   
    }
    }
};

void
main()
{
    LinkQueue a;

   
a.EnQueue("yige");
   
a.EnQueue("liangge");
   
a.EnQueue("sange");
    cout<<"当前队列长度是:"<<a.QueueLength()<<endl;
    char *q;
   
a.DeQueue(q);
    cout<<"当前队列长度是:"<<a.QueueLength()<<endl;
    cout<<"出列的是"<<q<<endl;
   
a.QueueClear();
    cout<<"当前队列长度是:"<<a.QueueLength()<<endl;
}

来自为知笔记(Wiz)

数据结构5_链队列

时间: 2024-10-12 11:11:44

数据结构5_链队列的相关文章

数据结构之 — 链队列

这次我们来实现队列.队列也是一种极其重要和基础的数据结构,队列的特点是先进先出(First In Frist On,FIFO). 正如栈一样,队列也是在计算机系统内应用非常广泛的一种数据结构,比如购票,打印机缓冲等等,现实生活中也有很多队列模型的例子,比如上车,买饭,银行医院叫号.... 队列按照存储结构不同也分为顺序队列和链队. 我们这次实现链队. 在这里我们要先说一下顺序队列存在“假溢出”的问题,也就是队列本身并没有满,但是因为不断出队导致游标移动却没有对游标的移动进行任何处理,导致队列似乎

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html 对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现.这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的

数据结构 - 链队列的实行(C语言)

数据结构-链队列的实现 1 链队列的定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已, 我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点,如下图所示. 空队列时,front和rear都指向头结点,如下图所示. 链队列的结构为: typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ typedef struct QNode /* 结点结构 */ { QElemTy

数据结构——链队列(linked queue)

/* linkedQueue.c */ /* 链队列 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> /* 链队列数据结构 */ typedef struct node { int data; /* 节点存储数据 */ struct node *next; /* 指向下一个节点的指针 */ } Node; /* front指向队列头,rear指向队列尾 */ /* front->next

数据结构(C实现)------- 链队列

链队列,即队列的链式存储结构,它是仅在表头删除和表尾插入的单链表,因此一个链队列需要设置两个分别指示队头元素和队尾元素的指针,为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点,由此,空的链队列的判断条件就是队头指针和队尾指针均指向头结点. 链队列的类型描述: //链队列类型描述 typedef int QElemType; typedef struct node{ QElemType data; struct node *next; }QNode,*QueuePtr; typedef

数据结构(二):链表、链队列

上一篇博文中主要总结线性表的顺序存储结构实现.比方顺序表.顺序队列和顺序栈.详细能够參考上篇博文 http://blog.csdn.net/lg1259156776/article/details/46993591 以下要进行学习和总结的是线性表的链式存储结构实现,比方链表和链队列. 顺序存储结构的优缺点 长处是逻辑相邻,物理相邻,可随机存取任一元素,存储空间使用紧凑:缺点是插入.删除操作须要移动大量的元素.平均移动n/2,预先分配空间需依照最大空间分配.利用不充分(C++ STL模板库中实现的

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

总结链队列 什么是链队? 队列的链式存储结构称为链队列.链队也有两个指针,队头指针和队尾指针,这样队头删除和队尾插入操作就会很方便,链式队列一般像单链表一样,有一个头结点. 图示: 具体实现: <span style="font-family:Courier New;font-size:14px;">#include <iostream> using namespace std; template <class T> struct Node { T

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和