数据结构 之 队列实现

在这里插入图片描述

与栈一样,队列也是一种操作受限的线性表。也有两种存储方式,即线性存储和链接存储(链表)。但队列的入队操作只允许在队尾,出队只能在队头进行操作,所以最早入队的元素最先出队,因此队列又叫做先入先出表(FIFO),常用的队列有循环队列,阻塞队列(出队或入队进行阻塞处理),并发队列(多线程操作安全队列)。因为动态创建队列的形式与栈基本相同,本文主要介绍线性队列的创建。动态创建队列可以参照栈的动态实现部分:https://blog.csdn.net/Chiang2018/article/details/82731108
建立顺序存储队列,必须为其静态分配好一块连续的存储空间,并通过队头指针、队尾指针进行管理。在实际使用时,为了使队列空间可以被重复利用,需要对几种特殊情况进行处理,即当队尾指针rear或队头指针front的增1操作超出了队列的空间范围,就要使其指针指向起始位置,所以可以根据rear==front来判断当前队列是否为空或者队列已满,为了区分这两种情况,实际上队列我们只使用MaxSize-1长度,即当队列满时,front = (rear+1)%MaxSize。
在这里插入图片描述

// Queue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>  
#include <new>  
 
//QueueList  队列 
//定义  
template<class T>  
class QueueList  
{  
public :  
    QueueList(int MaxListSize=10);  //构造函数
    ~QueueList()                             //析构函数 
    {
        delete[] elements;
    }  
  
    bool IsEmpty() const             //判断是否为空
    {
        return rear==front;
    }  

    int Length() const               //获取队列长度
    {
        return rear-front;
    }  

    int EnQueue(T& x); //入队 

    T DeQueue();  //出队

    T geteQueueData();  //获取队首数据,不出队

    bool IsFull() const             //判断是否满
    {
        return (rear+1)%MaxSize==front;
    }  

    void clear() ;  
  
private:  
    int rear;  //队尾指针
    int front;  //队首指针
    int MaxSize;  //队列最大长度
    T *elements;//一维动态数组  
  
};  

//实现...  
template<class T>  
QueueList<T>::QueueList(int MaxListSize)  
{   
    //基于公式的线性表的构造函数  
    MaxSize=MaxListSize;  
    elements=new T[MaxSize];  
    rear = front = 0;  
}  
  
template<class T>  
int QueueList<T>::EnQueue(T& x) 
{  
    if(IsFull()) 
    {
        return -1;  
    }

    elements[rear] = x;  
    rear = (rear+1)%MaxSize;
    return 0;  
}  
  
template<class T>  
T QueueList<T>::DeQueue()  
{  
    T data;
    if(IsEmpty()) 
    {
        return NULL;  
    }

    data = elements[front];
    front = (front+1)%MaxSize;

    return data;  
}  
  
template<class T>  
T QueueList<T>::geteQueueData() 
{  
    if(IsEmpty()) 
    {
        return NULL;  
    }

    return elements[front];
}  
  
template<class T>  
void QueueList<T>::clear()
{  
    delete []elements;

    return ;  
}  
  

 
void QueueListSample()  
{  
    int j = 0;
    int a = 10,b = 20,c = 30,d = 40,e = 50;
    QueueList<int> Q(6);  
    std::cout<<"Length="<<Q.Length()<<std::endl;  
    std::cout<<"IsEmpty="<<Q.IsEmpty()<<std::endl;  
  
    Q.EnQueue(a);
    Q.EnQueue(b);  
    Q.EnQueue(c);  
    Q.EnQueue(d);  
    Q.EnQueue(e);  
    
    j = Q.DeQueue(); 
    std::cout<<j<<std::endl;  

    j = Q.DeQueue(); 
    std::cout<<j<<std::endl; 

    j = Q.DeQueue(); 
    std::cout<<j<<std::endl; 

    j = Q.DeQueue(); 
    std::cout<<j<<std::endl; 

    j = Q.DeQueue(); 
    std::cout<<j<<std::endl; 

    return;
}  

int _tmain(int argc, _TCHAR* argv[])  
{  
    QueueListSample();  
  
    //暂停操作  
    char str;  
    std::cin>>str;  
    //程序结束  
    return 0;  
}  

运行结果如下图:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值