//------------------------------------------------------------------------------
// 隊列 即比單鏈表多了頭尾標志而已,本質還是單鏈表
//------------------------------------------------------------------------------
#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;
}