队列:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列是有序集合,新添加的一端为队尾,另一端为队头,当一个元素从队尾进入队列时,一直向队首移动,直到它成为移除的元素为止。这种排序是先进先出FIFO,生活中常见的例子就是去学校食堂打饭,人多时候需要排队,排队在前面的同学先打饭,新来的同学在后面排队,知道前面同学都打完饭,才轮到它。
1、队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
2、与栈相反,队列是一种先进先出的线性表.
3、实现一个队列同样需要顺序表或链表作为基础。
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
typedef int DATATYPE;
typedef struct Node
{
DATATYPE data;
Node *next;
}QueueNode;
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
}LinkQueue;
LinkQueue* creatQueue()
{
LinkQueue *temp = new LinkQueue;
if (NULL == temp)
{
perror("creat Queue");
return NULL;
}
temp->head = NULL;
temp->tail = NULL;
return temp;
}
//进队,只能从队尾进
int enterQueue(LinkQueue *mqueue,DATATYPE *data)
{
QueueNode *newnode = new QueueNode;
if (NULL == newnode)
{
perror("enterQueue new node");
return 1;
}
newnode->data = *data;
newnode->next = NULL;
if (NULL == mqueue->tail) //判断queue是否为空
{
mqueue->head = newnode;
mqueue->tail = newnode;
}
else
{
mqueue->tail->next = newnode;
mqueue->tail = newnode; //更新队尾
}
return 0;
}
//出队列,只能从队头出
int quitQueue(LinkQueue *mqueue, DATATYPE *data)
{
QueueNode *temp = mqueue->head;
if (NULL != temp)
{
mqueue->head = mqueue->head->next; //更新队头
memcpy(data, &temp->data, sizeof(DATATYPE));
delete temp;
return 0;
}
else
{
return 1;
}
}
//销毁队列
int destroyQueue(LinkQueue *mqueue)
{
while (1)
{
int ret = quitQueue(mqueue, NULL); //将队列里的元素全部释放
if (1 == ret)
{
break;
}
}
delete mqueue;
return 0;
}
int main()
{
LinkQueue *m_queue = creatQueue();
int array[5] = { 1,2,3,4,5 };
int i = 0;
DATATYPE data;
for (i = 0; i < 5;++i)
{
enterQueue(m_queue, &array[i]);
}
while (1)
{
int ret = quitQueue(m_queue, &data);
if (0 == ret)
{
cout << data << endl;
}
else
{
break;
}
}
system("pause");
return 0;
}