1. 程式人生 > >queue(佇列)的用法與迴圈佇列對照(常用方法)

queue(佇列)的用法與迴圈佇列對照(常用方法)

其實啊,我寫這篇部落格的時候還不知道C++的具體語法(emmmmmm以後肯定會),只是看到人家的程式裡能夠直接呼叫queue省時省力,而我只會一遍又一遍的寫queue的子函式,太費勁。所以呢,出於偷懶的目的,我總結一下偷懶的常用途徑。

佇列的定義

  • 佇列是一種容器介面卡,專門設計用於在FIFO上下文(先進先出)中操作,其中元素插入容器的一端並從另一端提取。 佇列被實現為容器介面卡,它是使用特定容器類的封裝物件作為其基礎容器的類,提供一組特定的成員函式來訪問其元素。 元素被推入特定容器的“背部”並從其“前”彈出。

使用時必須表明的標頭檔案

  • #include <iostream>
  • #include <queue>
  • #include <cstdio>
  • #include <cstdlib>
  • using namespace std;

常見用法(與c中迴圈佇列進行對照,需要注意的是迴圈佇列需要提前標註佇列容量MaxSize

  • queue<Type> Queue —>定義一個queue變數
    typedef int Position;
    typedef struct QNode *PtrToQNode;
    struct QNode {
     	ElementType *Data;//儲存元素的陣列
    Position Front, Rear;//佇列的頭、尾指標 int MaxSize;//佇列的最大容量 };//Front作出隊刪除操作,Rear作入隊操作 typedef PtrToQNode Queue; Queue CreateQueue(int MaxSize) { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementTye *)malloc(MaxSize * sizeof(ElementType)); Q->Front = Q->Rear = 0; Q->MaxSize =
    MaxSize; }
  • Queue.empty()—>判斷佇列是否為空,空返回1,非空返回0
    bool Isempty(Queue Q)
    {
      	return (Q->Front == Q->Rear);
    } 
    
  • Queue.push()—>入隊,即在已有元素後面增加元素
    void AddQ(Queue Q,ElementType X)
    {
    	Q->Rear = (Q->Rear + 1) % Q->MaxSize;
    	Q->Data[Q->Rear] = X;
    }
    
  • Queue.size()—>輸出現有佇列的長度
    • 迴圈佇列可以通過記錄cnt來輸出現有佇列的長度,即每入隊一次cnt++
  • Queue.front()—>顯示佇列第一個元素,但不出佇列,即為Q->Data[Front]
  • Queue.back()—>顯示最後一個元素。在迴圈佇列中,即為Q->Data[Rear]
  • Queue.pop()—>出佇列,不顯示出佇列的元素
    void DeleteQ(Queue Q)
    {
    	Q->Front = (Q->Front + 1) % Q->MaxSize;
    }
    

對照示例程式

  • 使用容器queue
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>

using namespace std;
int main()
{
	queue <int> myQ;

	cout<< "現在 queue 是否 empty? "<< myQ.empty() << endl; 

	for(int i =0; i<10 ; i++)
	{
		myQ.push(i);
	}
	for(int i=0; i<10; i++)
	{
		printf("myQ.size():%d\n",myQ.size());
		cout << myQ.front()<<endl;
		myQ.pop();
	}

	return 0;
}

使用queue

  • 不使用容器queue
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
	ElementType *Data;
	Position front, rear;
	int MaxSize;
}; 
typedef PtrToQNode Queue;
Queue CreateQ(int MaxSize)
//建佇列
{
	Queue Q = (Queue)malloc(sizeof(struct QNode));
	Q->Data = (ElementType *)malloc(MaxSize*sizeof(ElementType));
	Q->front = Q->rear = 0;
	Q->MaxSize = MaxSize;
} 
void AddQ(Queue Q, ElementType V)
//入佇列
{
	Q->rear = (Q->rear + 1)%Q->MaxSize ;
	Q->Data[Q->rear ] = V;
 } 
 
ElementType DeleteQ(Queue Q)
//出佇列
{
	Q->front = (Q->front +1)%Q->MaxSize;
	return Q->Data[Q->front ];
 }
int  IsEmpty(Queue Q)
//判斷佇列是否為空
{
	return (Q->rear ==Q->front );
 } 
int main()
{
	Queue Q;
	int MaxSize = 10;
	int cnt = 0;
	Q = CreateQ(MaxSize);
	printf("現在 Q 是否 empty? %d\n", IsEmpty(Q) );
	for (int i = 0; i < 10; i++){
		AddQ(Q, i);	
		cnt++;
	}
	for (int i = 0; i < 10; i++){
		printf("Q的長度:%d\n", cnt);
		printf("%d\n", DeleteQ(Q));
		cnt--;
	}
	 return 0;

}

不使用queue