隊列:
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(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;
}