1. 程式人生 > >【資料結構】佇列的基本認識和佇列的基本操作

【資料結構】佇列的基本認識和佇列的基本操作

一.佇列的概念

佇列是一種先進先出的線性表(棧是先進後出)。它只允許在表的一端進行插入,或者刪除元素。 

  • 進入插入操作的一端稱為隊尾(rear)(入佇列) 
  • 進行刪除操作的一端稱為對頭(front)(出佇列)  
  • 佇列具有先進先出的(FIFO)的特性

    二.順序佇列   

1.隊頭不動,出佇列時隊頭後的所有元素向前移動 缺陷:操作時如果是出佇列比較多,需要大量搬移元素隊頭不動---->大量搬移元素----->時間複雜度為O(n)2.隊頭移動,出佇列時隊頭向後移動一個位置時間複雜度為O(1)如果再有F,G進行入佇列操作,就會出現假溢位問題缺陷:容易造成佇列假溢位 對於假溢位和真溢位的理解:假溢位:順序佇列因多次入佇列和出佇列操作後出現的尚有儲存空間但是不能在進入佇列操作的溢位真溢位:順序佇列最大儲存空間已經存滿但是還要進行入佇列操作所引起的溢位佇列初始條件:隊頭指標=隊尾指標=0

佇列滿條件:隊尾指標=size(設隊列當前容量為size)
佇列空條件:隊頭指標=隊尾指標queue.h
#pragma once 
#include<stdio.h>
#include<Windows.h>
#include<assert.h>

typedef int DataType;
#define SIZE 10

typedef struct Queue
{
	DataType arry[SIZE];
	int front;
	int rear;

}Queue;


//初始化佇列
void QueueInit(Queue* q);

// 入佇列
void QueuePush(Queue* q, DataType data);

// 出佇列
void QueuePop(Queue* q);

// 獲取佇列頂元素 
DataType QueueTop(Queue* q);

// 獲取佇列中元素個數 
int QueueSize(Queue* q);

// 檢測佇列是否為空 
int QueueEmpty(Queue* q);

//銷燬佇列
void DestroyQueue(Queue* q);

//列印佇列
void printQueue(Queue* q);

queue.c
#include"queue.h"



//初始化佇列
void QueueInit(Queue*q)
{
	
	
	//初始化佇列只需讓隊頭指標和隊尾指標都指向0
	q->front = q->rear = 0;
	return;

}


// 入佇列
void QueuePush(Queue* q, DataType data)
{
	assert(q);
	if (SIZE == q->rear)
	{
		printf("棧溢位!!!");
			return;
	}
	else
	{
		q->rear++;

		q->arry[q->rear] = data;
		



	}

	return;
}

// 出佇列
void QueuePop(Queue* q)
{
	if (q->front == q->rear )
	{
		printf("佇列已空!!!");
		return;
	}
	else
	q->front++;


}

// 獲取佇列頂元素 
DataType QueueTop(Queue* q)
{
	if (q->front == q->rear)
	{
		printf("佇列已空!!!");

		return 0;
	}

	return (q->arry[q->front]);

}

// 獲取佇列中元素個數 
int QueueSize(Queue* q)
{
	if (q->front == q->rear)
	{
		printf("佇列已空!!!");

		return 0;
	}

	return (q->rear - q->front);

}

// 檢測佇列是否為空 
int QueueEmpty(Queue* q)
{
	if (q->front == q->rear)
	
		printf("佇列已空!!!");

		return  0;


}

//銷燬佇列
void DestroyQeue(Queue* q)
{




}


//列印佇列
void printQueue(Queue *q)
{
	if (q->front == q->rear)

	{
		printf("佇列已空!!!\n");

		return;
	}

	Queue* p = q;
	
	while (p->rear != p->front )
	{
		p->front++;
		if (p->front < q->front + 1)
		{
			printf("%d->", p->arry[p->front]);

		}
		else
		{

			printf("%d->", p->arry[p->front]);
		}		

	}


	printf("\n");
}

test.c
#include"queue.h"

void QueueTest()
{
	Queue q;

	
	QueueInit(&q);

	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	

    QueuePop(&q);
	printQueue(&q);



}



int  main()
{
	QueueTest();

	system("pause");
	return 0;
}
後續會更新出迴圈佇列和鏈式佇列的基本操作以及佇列的應用棧的理解兩者可以比較相互點選開啟連結