數據結構—隊列queue

隊列:

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

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章