队列(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++常用算法手册》 《数据结构-清华大学严蔚敏》