与栈一样,队列也是一种操作受限的线性表。也有两种存储方式,即线性存储和链接存储(链表)。但队列的入队操作只允许在队尾,出队只能在队头进行操作,所以最早入队的元素最先出队,因此队列又叫做先入先出表(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;
}
运行结果如下图: