一、概念
队列(Queue):也是运算受限的线性表。是一种先进先出(FirstIn FirstOut ,简称FIFO)的线性表。只允许在表的一端进行插入,而在另一端进行删除。
队首(front):允许进行删除的一端称为队首。
队尾(rear):允许进行插入的一端称为队尾。
例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。
队列中没有元素时称为空队列。在空队列中依次加入元素a1, a2, …, an之后,a1是队首元素,an是队尾元素。显然退出队列的次序也只能是a1, a2, …, an,即队列的修改是依先进先出的原则进行的,如图3-5所示。
二、队列的抽象数据类型定义
ADT Queue{
数据对象:D ={ ai|ai∈ElemSet, i=1, 2, …, n, n >= 0 }
数据关系:R = {<ai-1, ai> | ai-1, ai∈D, i=2,3,…,n }
约定a1端为队首,an端为队尾。
基本操作:
Create():创建一个空队列;
EmptyQue():若队列为空,则返回true ,否则返回flase ;
⋯⋯
InsertQue(x) :向队尾插入元素x;
DeleteQue(x) :删除队首元素x;
} ADT Queue
三、代码实现:
Queue.h
#ifndef __CHelloWorld__Queue__
#define __CHelloWorld__Queue__
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
#define QUEUELEN 15
typedef struct
{
char name[10]; //结点的关键字
int age;
}DATA;
typedef struct
{
DATA data[QUEUELEN];
int head;
int tail;
}SQType;
class Queue
{
public:
bool init();
static Queue * create(void);
SQType *SQTypeInit(); //队列初始化
int SQTypeIsEmpty(SQType *q); //判断空队列
int SQTypeIsFull(SQType *q); //清空满队列
void SQTypeClear(SQType *q); //清空队列
void SQTypeFree(SQType *q); //释放队列
int InSQType(SQType *q,DATA data);//入队
DATA *OutSQType(SQType *q); //出队
DATA *PeekSQType(SQType *q); //读结点
int SQLTypeLen(SQType *q); //计算队列长度
};
#endif /* defined(__CHelloWorld__Queue__) */
Queue.cpp#include "Queue.h"
SQType *Queue::SQTypeInit()
{
SQType *q;
if (q = (SQType*)malloc(sizeof(SQType)))
{
q->head = 0;
q->tail = 0;
return q;
}
else
{
return NULL;
}
}
int Queue::SQTypeIsEmpty(SQType *q)
{
int temp;
temp = q->head == q->tail;
return (temp);
}
int Queue::SQTypeIsFull(SQType *q)
{
int temp;
temp = q->tail == QUEUELEN;
return (temp);
}
void Queue::SQTypeClear(SQType *q)
{
q->head = 0;
q->tail = 0;
}
void Queue::SQTypeFree(SQType *q)
{
if (q!= NULL)
{
free(q);
}
}
int Queue::InSQType(SQType *q, DATA data)
{
if (q->tail == QUEUELEN)
{
std::cout<< "队列已满!操作失败!\n";
return 0;
}
else
{
q->data[q->tail++] = data;
return 1;
}
}
DATA *Queue::OutSQType(SQType *q)
{
if (q->head == q->tail)
{
std::cout<< "\n队列已空!操作失败!\n";
exit(0);
}
else
{
return &(q->data[q->head++]);
}
}
DATA *Queue::PeekSQType(SQType *q)
{
if (SQTypeIsEmpty(q))
{
std::cout<< "\n空队列!\n";
return NULL;
}
else
{
return &(q->data[q->head]);
}
}
int Queue::SQLTypeLen(SQType *q)
{
int temp;
temp = q->tail - q->head;
return temp;
}
Queue * Queue::create()
{
Queue * pRet = new Queue();
if (pRet && pRet->init())
{
//pRet->autorelease();
}
else
{
delete pRet;
}
return pRet;
}
bool Queue::init()
{
return true;
}
main.cpp
#include <iostream>
#include "Queue.h"
using namespace std;
int main(int argc, const char * argv[])
{
SQType *stack;
DATA data;
DATA *data1;
Queue *myQueue = Queue::create();
stack = myQueue->SQTypeInit();
std::cout << "队列操作演示\n";
std::cout << "输入(姓名 年龄)进行入队列操作:";
fflush(stdin); //清空输入缓冲区
do
{
scanf("%s%d",data.name,&data.age);
if (strcmp(data.name, "0") == 0)
{
break;
}
else
{
myQueue->InSQType(stack, data);
}
} while (1);
do
{
std::cout << "出队列操作:按任意键进行出栈操作:\n";
getchar();
data1 = myQueue->OutSQType(stack);
printf("出队列的数据是(%s,%d)\n",data1->name,data1->age);
} while (1);
myQueue->SQTypeFree(stack);
delete myQueue;
// std::cout << "Hello, World!\n";
return 0;
}
演示效果图:
参考书籍:《C/C++常用算法手册》 《数据结构-清华大学严蔚敏》