程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 隊列操作

隊列操作

編輯:C++入門知識

//------------------------------------------------------------------------------
// 隊列 即比單鏈表多了頭尾標志而已,本質還是單鏈表
//------------------------------------------------------------------------------
#include <iostream>
using namespace std;

typedef struct Node
{
	int   data;
	Node* next;
} Node, *LPNode;

typedef struct Queue
{
	Node* first;			// 頭
	Node* rear;				// 尾
}Queue, *LPQueue;


//******************************************************************************
// Name: CreateQueue
// Desc: 創建隊列
//******************************************************************************
Queue* CreateQueue()
{
	// 創建並返回一個空的隊列
	Queue* tempQueue = new Queue;
	tempQueue->first = NULL;
	tempQueue->rear  = NULL;
	return tempQueue;
}

//******************************************************************************
// Name: Insert
// Desc: 入隊
//******************************************************************************
Queue* Insert(Queue* que, int data)
{
	// 隊裡為空,不能進行入隊操作
	if(que == NULL)
	{
		return  NULL;
	}

	// 先創建一個節點
	Node* newNode = new Node;
	newNode->data = data;
	newNode->next = NULL;

	// 因為隊列的特點是先進先出,所以入隊的時候,插入的位置在最後
	if(que->first == NULL)
	{
		//----------------------------------------------------------------------
		// 頭和尾公用一塊地址,所以後面插入的時候,隊首也將會自動設置next
		//----------------------------------------------------------------------
		que->first = newNode;					// 隊首
		que->rear  = newNode;
	}
	else
	{
		que->rear->next = newNode;
		que->rear = newNode;					// 隊尾
	}

	// 返回隊列
	return que;

}

//******************************************************************************
// Name: OutOfQueue
// Desc: 出隊列, 返回隊首元素使用一維指針,因為已經是指針的指針,能改變內容
//******************************************************************************
Node* OutOfQueue1(Queue* que)
{
	if(que == NULL)
	{
		cout<<"隊列為空"<<endl;
		return NULL;
	}

	// 先進先出原則
	Node* outNode = que->first;
	que->first = que->first->next;

	return outNode;							// 返回出隊列的元素
}


//******************************************************************************
// Name: OutOfQueue
// Desc: 出隊列, 返回隊首元素,改變了隊列的指針,使用二維指針
//******************************************************************************
Node* OutOfQueue2(Queue** que)
{
	if(*que == NULL)
	{
		cout<<"隊列為空"<<endl;
		return NULL;
	}

	// 先進先出原則
	Node* outNode = (*que)->first;
	(*que)->first = (*que)->first->next;

	return outNode;							// 返回出隊列的元素
}


//******************************************************************************
// Name: PrintQueue
// Desc: 打印隊列
//******************************************************************************
void PrintQueue(Queue* que)
{
	/*			改變指針的指針,改變了堆內存的東西,不想單雙鏈表那樣
	Queue* tempQue = que;
	while(tempQue->first != NULL)			
	{
		cout<<tempQue->first->data<<" ";
		tempQue->first = tempQue->first->next;
	}
	cout<<endl;
	*/


	if(que == NULL)	
	{
		cout<<"隊列為空"<<endl;
	}

	Node* tempNode = que->first;
	while(tempNode != NULL)
	{
		cout<<tempNode->data<<" ";
		tempNode = tempNode->next;
	}
	cout<<endl;
}

//******************************************************************************
// Name: QueueLength
// Desc: 返回隊列長度
//******************************************************************************
int QueueLength(Queue* que)
{
	if(que == NULL)
	{
		return 0;
	}

	int currentLength = 0;
	Node* tempNode = que->first;
	while(tempNode != NULL)
	{
		++currentLength;
		tempNode = tempNode->next;
	}

	return currentLength;

}


int main()
{
	// 創建隊列
	Queue* que = CreateQueue();
	cout<<"創建隊列成功,輸入幾組要入隊的元素"<<endl;
	
	// 入隊
	int insertElem;
	while(cin>>insertElem)
	{
		que = Insert(que, insertElem);
	}

	// 打印
	cout<<"打印隊列:"<<endl;
	PrintQueue(que);

	// 打印
	cout<<"打印隊列:"<<endl;
	PrintQueue(que);

	// 出隊列
	Node* outNode = OutOfQueue1(que);
	cout<<"隊列首出隊:"<<outNode->data<<endl;

	// 再次打印
	PrintQueue(que);

	// 打印長度
	cout<<"當前隊列長度為:"<<QueueLength(que)<<endl;

	

	system("pause");
	return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved