国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列

這篇具有很好參考價(jià)值的文章主要介紹了探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

?? 歡迎大家來(lái)到貝蒂大講堂??

????養(yǎng)成好習(xí)慣,先贊后看哦~????

所屬專(zhuān)欄:數(shù)據(jù)結(jié)構(gòu)與算法
貝蒂的主頁(yè):Betty’s blog

1. 雙向隊(duì)列的定義

**雙向隊(duì)列(double?ended queue)**是一種特殊的隊(duì)列,它允許在隊(duì)列的隊(duì)尾與隊(duì)頭插入與刪除元素。根據(jù)其定義,我們也可以理解為兩個(gè)棧在棧底相連。

  1. 隊(duì)尾入隊(duì)

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

  1. 隊(duì)首入隊(duì)

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

  1. 隊(duì)尾出隊(duì)

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

  1. 隊(duì)尾出隊(duì)

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

2. 雙向隊(duì)列的分類(lèi)

雙向隊(duì)列也是線性表的一種,所以也可以分別用鏈表數(shù)組實(shí)現(xiàn)。基于鏈表實(shí)現(xiàn):為了方便雙向隊(duì)列在尾部的插入與刪除操作,所以我們選用雙向鏈表?;跀?shù)組實(shí)現(xiàn):與隊(duì)列實(shí)現(xiàn)類(lèi)似,需要用循環(huán)數(shù)組(原因參考隊(duì)列實(shí)現(xiàn))。

探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列,數(shù)據(jù)結(jié)構(gòu)與算法:C/C++全解析,數(shù)據(jù)結(jié)構(gòu),雙向隊(duì)列,隊(duì)列,雙向隊(duì)列的應(yīng)用,C語(yǔ)言

3. 雙向隊(duì)列的功能

  1. 隊(duì)列的初始化。
  2. 判斷隊(duì)列是否為空。。
  3. 返回隊(duì)頭與隊(duì)尾的元素。
  4. 返回隊(duì)列的大小。
  5. 入隊(duì)與出隊(duì)。
  6. 打印隊(duì)列的元素。
  7. 銷(xiāo)毀隊(duì)列。

4. 雙向隊(duì)列的聲明

4.1. 鏈?zhǔn)疥?duì)

雙向隊(duì)列與普通隊(duì)列的聲明區(qū)別就在于雙向隊(duì)列是基于雙向鏈表的方式實(shí)現(xiàn)。

typedef int QDataType;
typedef struct DuListNode
{
	QDataType data;
	struct Node* prev;
	struct Node* next;
}DuListNode;

typedef struct Deque
{
	size_t size;
	DuListNode* front;
	DuListNode* rear;
}Deque;

4.2. 循環(huán)隊(duì)

循環(huán)隊(duì)列的實(shí)現(xiàn)方式與普通隊(duì)列差不多。

typedef int QDataType;
#define MAXSIZE 50  //定義元素的最大個(gè)數(shù)
typedef struct {
    QDataType *data;
    int front;  //頭指針
    int rear;   //尾指針
}Deque;

5. 隊(duì)列的初始化

5.1. 鏈?zhǔn)疥?duì)

void DequeInit(Deque* d)//初始化
{
	assert(d);
	d->front = NULL;
	d->rear = NULL;
	d->size = 0;
}

5.2. 循環(huán)隊(duì)

void DequeInit(Deque* d)//初始化
{
	d->data = (QDataType*)malloc(sizeof(QDataType )* MAXSIZE);
	if (d->data == NULL)
	{
		perror("malloc fail:");
		return;
	}
	d->front = 0;
	d->rear = 0;
}

5.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:鏈?zhǔn)疥?duì)空間是一個(gè)固定大小,空間復(fù)雜度為O(1)。而需要開(kāi)辟整個(gè)隊(duì)列的大小,空間復(fù)雜度為O(N)。

6. 判斷隊(duì)列是否為空

6.1. 鏈?zhǔn)疥?duì)

bool DequeEmpty(Deque* d)//判斷是否為空
{
	assert(d);
	return (d->front == NULL) && (d->rear == NULL);
}

6.2. 循環(huán)隊(duì)

bool DequeEmpty(Deque* d)//判斷是否為空
{
	assert(d);
	return d->front == d->rear;
}

6.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)。

7. 判斷隊(duì)列是否為滿(mǎn)

7.1. 鏈?zhǔn)疥?duì)

鏈?zhǔn)疥?duì)并不需要判斷。

7.2. 循環(huán)隊(duì)

為什么要取模操作,可以參考一下上一篇普通隊(duì)列的實(shí)現(xiàn),同下。

bool DequeFull(Deque* d)//判斷隊(duì)列是否滿(mǎn)
{
	assert(d);
	return (d->rear + 1) % MAXSIZE == d->front;
}

8. 返回隊(duì)頭與隊(duì)尾的元素

8.1. 鏈?zhǔn)疥?duì)

QDataType DequeFront(Deque* d)//獲取隊(duì)頭元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->front->data;
}
QDataType DequeBack(Deque* d)//獲取隊(duì)尾元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->rear->data;
}

8.2. 循環(huán)隊(duì)

QDataType DequeFront(Deque* d)//獲取隊(duì)頭元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->data[d->front];
}
QDataType DequeBack(Deque* d)//獲取隊(duì)尾元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->data[(d->rear-1+MAXSIZE)%MAXSIZE];
}

8.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

9. 返回隊(duì)列的大小

9.1. 鏈?zhǔn)疥?duì)

size_t DequeSize(Deque* d)//隊(duì)列長(zhǎng)度
{
	return d->size;
}

9.2. 循環(huán)隊(duì)

size_t DequeSize(Deque* d)//獲取隊(duì)列長(zhǎng)度
{
	assert(d);
	return (d->rear - d->front + MAXSIZE) % MAXSIZE;
}

9.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

10. 入隊(duì)

10.1. 鏈?zhǔn)疥?duì)

10.1.1. 隊(duì)頭入隊(duì)
void DequeFrontPush(Deque* d, QDataType x)//隊(duì)首入隊(duì)
{
	assert(d);
	DuListNode* newnode = (DuListNode*)malloc(sizeof(DuListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;
	if (d->front == NULL)
	{
		d->front = d->rear = newnode;
	}
	else
	{
		d->front->prev = newnode;
		newnode->next = d->front;
		d->front = newnode;
	}
    d->size++;
}
10.1.2. 隊(duì)尾入隊(duì)
void DequeRearPush(Deque* d, QDataType x)//隊(duì)尾入隊(duì)
{
	assert(d);
	DuListNode* newnode = (DuListNode*)malloc(sizeof(DuListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;
	if (d->front == NULL)
	{
		d->front = d->rear = newnode;
	}
	else
	{
		d->rear->next = newnode;
		newnode->prev = d->rear;
		d->rear = newnode;
	}
	d->size++;
}

10.2. 循環(huán)隊(duì)

入隊(duì)需要提前判斷隊(duì)列是否為滿(mǎn)。

10.2.1. 隊(duì)頭入隊(duì)
void DequeFrontPush(Deque* d, QDataType x)//隊(duì)首入隊(duì)
{
	assert(d);
	if (DequeFull(d))
	{
		printf("隊(duì)列已滿(mǎn)\n");
		return;
	}
	d->data[(d->front - 1 + MAXSIZE) % MAXSIZE]=x;
	d->front = (d->front - 1 + MAXSIZE) % MAXSIZE;
}
10.2.2. 隊(duì)尾入隊(duì)
void DequeRearPush(Deque* d, QDataType x)//隊(duì)尾入隊(duì)
{
	assert(d);
	if (DequeFull(d))
	{
		printf("隊(duì)列已滿(mǎn)\n");
		return;
	}
	d->data[d->rear] = x;
	d->rear = (d->rear + 1) % MAXSIZE;
}

10.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

11. 出隊(duì)

11.1. 鏈?zhǔn)疥?duì)

出隊(duì)需要提前判斷隊(duì)列是否為空。

11.1.1. 隊(duì)頭出隊(duì)
void DequeFrontPop(Deque* d)//隊(duì)首出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	//1.只有一個(gè)結(jié)點(diǎn)
	if (d->front == d->rear)
	{
		free(d->front);
		d->front = d->rear = NULL;
	}
	//2.有多個(gè)結(jié)點(diǎn)
	else
	{
		DuListNode* next = d->front->next;
		next->prev = NULL;
		d->front->next = NULL;
		free(d->front);
		d->front = next;
	}
	d->size--;
}
11.1.2. 隊(duì)尾出隊(duì)
void DequeRearPop(Deque* d)//隊(duì)尾出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	//1.只有一個(gè)結(jié)點(diǎn)
	if (d->front == d->rear)
	{
		free(d->front);
		d->front = d->rear = NULL;
	}
	else
	{
		DuListNode* prev = d->rear->prev;
		prev->next = NULL;
		d->rear->prev = NULL;
		free(d->rear);
		d->rear = prev;
	}
    d->size--;
}

11.2. 循環(huán)隊(duì)

11.2.1. 隊(duì)頭出隊(duì)
void DequeFrontPop(Deque* d)//隊(duì)首出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	d->front = (d->front + 1) % MAXSIZE;
}
11.2.2. 隊(duì)尾出隊(duì)
void DequeRearPop(Deque* d)//隊(duì)尾出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	d->rear = (d->rear - 1+MAXSIZE) % MAXSIZE;
}

11.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

12. 打印隊(duì)列元素

12.1. 鏈?zhǔn)疥?duì)

void DequePrint(Deque* d)//打印隊(duì)列元素
{
	assert(d);
	DuListNode* cur = d->front;
	DuListNode* tail = d->rear;
	printf("隊(duì)頭:");
	while (cur != tail->next)
	{
		printf("%d<=>", cur->data);
		cur = cur->next;
	}
	printf("隊(duì)尾\n");
}

12.2. 循環(huán)隊(duì)

void DequePrint(Deque* d)//打印隊(duì)列元素
{
	assert(d);
	int cur = d->front;
	printf("隊(duì)頭->");
	while (cur != d->rear)
	{
		printf("%d->", d->data[cur]);
		cur = (cur + 1) % MAXSIZE;
	}
	printf("隊(duì)尾\n");

}

12.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列都需要遍歷這個(gè)隊(duì)列,所以時(shí)間復(fù)雜度為O(N)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

13. 銷(xiāo)毀隊(duì)列

13.1. 鏈?zhǔn)疥?duì)

void DequeDestroy(Deque* d)//銷(xiāo)毀隊(duì)列
{
	assert(d);
	DuListNode* cur = d->front;
	while (cur)
	{
		DuListNode* del = cur;
		cur = cur->next;
		free(del);
		del = NULL;
	}
	d->front = d->rear = NULL;
}

13.2. 循環(huán)隊(duì)

void DequeDestroy(Deque* d)//銷(xiāo)毀隊(duì)列
{
	assert(d);
	free(d->data);
	d->data = NULL;
	d->front = d->rear = 0;
}

13.3. 復(fù)雜度分析

  • 時(shí)間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)時(shí)間都是一個(gè)常數(shù),所以時(shí)間復(fù)雜度為O(1)。
  • 空間復(fù)雜度:無(wú)論是鏈?zhǔn)疥?duì)還是循環(huán)隊(duì)列花費(fèi)空間都是一個(gè)固定大小,所以空間復(fù)雜度為O(1)

14. 對(duì)比與應(yīng)用

14.1. 對(duì)比

雙向隊(duì)列的兩種實(shí)現(xiàn)方式的效果與普通隊(duì)列實(shí)現(xiàn)差不多,這里就不在一一贅述。

14.2. 應(yīng)用

雙向隊(duì)列兼?zhèn)潢?duì)列與棧的性質(zhì),所以可以應(yīng)用于這兩種數(shù)據(jù)結(jié)構(gòu)的所有應(yīng)用場(chǎng)景。

此外它應(yīng)用于撤銷(xiāo)的一種情景:通常情況下,撤銷(xiāo)是以棧的方式實(shí)現(xiàn),當(dāng)我們每次更改時(shí)就入棧,撤銷(xiāo)就出棧。但是我們知道系統(tǒng)給與棧的空間是有限的,我們不可能一直入棧。當(dāng)入棧超過(guò)一個(gè)限度時(shí),我們就用過(guò)刪除棧底的數(shù)據(jù),這時(shí)棧這個(gè)數(shù)據(jù)結(jié)構(gòu)就無(wú)法滿(mǎn)足需求。所以這時(shí)我們可以使用雙向隊(duì)列來(lái)實(shí)現(xiàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-845950.html

15. 完整代碼

15.1. 鏈?zhǔn)疥?duì)

15.1.1. Deque.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int QDataType;
typedef struct DuListNode
{
	QDataType data;
	struct Node* prev;
	struct Node* next;
}DuListNode;

typedef struct Deque
{
	size_t size;
	DuListNode* front;
	DuListNode* rear;
}Deque;
void DequeInit(Deque* d);//初始化
bool DequeEmpty(Deque* d);//判斷是否為空
QDataType DequeFront(Deque* d);//獲取隊(duì)頭元素
QDataType DequeBack(Deque* d);//獲取隊(duì)尾元素
size_t DequeSize(Deque* d);//獲取隊(duì)列長(zhǎng)度
void DequeFrontPush(Deque* d, QDataType x);//隊(duì)首入隊(duì)
void DequeRearPush(Deque* d, QDataType x);//隊(duì)尾入隊(duì)
void DequeFrontPop(Deque* d);//隊(duì)首出隊(duì)
void DequeRearPop(Deque* d);//隊(duì)尾出隊(duì)
void DequePrint(Deque* d);//打印隊(duì)列元素
void DequeDestroy(Deque* d);//銷(xiāo)毀隊(duì)列
15.1.2. Deque.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Deque.h"
void DequeInit(Deque* d)//初始化
{
	assert(d);
	d->front = NULL;
	d->rear = NULL;
	d->size = 0;
}
bool DequeEmpty(Deque* d)//判斷是否為空
{
	assert(d);
	return (d->front == NULL) && (d->rear == NULL);
}
QDataType DequeFront(Deque* d)//獲取隊(duì)頭元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->front->data;
}
QDataType DequeBack(Deque* d)//獲取隊(duì)尾元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->rear->data;
}
size_t DequeSize(Deque* d)//隊(duì)列長(zhǎng)度
{
	return d->size;
}
void DequeFrontPush(Deque* d, QDataType x)//隊(duì)首入隊(duì)
{
	assert(d);
	DuListNode* newnode = (DuListNode*)malloc(sizeof(DuListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;
	if (d->front == NULL)
	{
		d->front = d->rear = newnode;
	}
	else
	{
		d->front->prev = newnode;
		newnode->next = d->front;
		d->front = newnode;
	}
    d->size++;
}
void DequeRearPush(Deque* d, QDataType x)//隊(duì)尾入隊(duì)
{
	assert(d);
	DuListNode* newnode = (DuListNode*)malloc(sizeof(DuListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;
	if (d->front == NULL)
	{
		d->front = d->rear = newnode;
	}
	else
	{
		d->rear->next = newnode;
		newnode->prev = d->rear;
		d->rear = newnode;
	}
	d->size++;
}
void DequeFrontPop(Deque* d)//隊(duì)首出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	//1.只有一個(gè)結(jié)點(diǎn)
	if (d->front == d->rear)
	{
		free(d->front);
		d->front = d->rear = NULL;
	}
	//2.有多個(gè)結(jié)點(diǎn)
	else
	{
		DuListNode* next = d->front->next;
		next->prev = NULL;
		d->front->next = NULL;
		free(d->front);
		d->front = next;
	}
	d->size--;
}
void DequeRearPop(Deque* d)//隊(duì)尾出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	//1.只有一個(gè)結(jié)點(diǎn)
	if (d->front == d->rear)
	{
		free(d->front);
		d->front = d->rear = NULL;
	}
	else
	{
		DuListNode* prev = d->rear->prev;
		prev->next = NULL;
		d->rear->prev = NULL;
		free(d->rear);
		d->rear = prev;
	}
    d->size--;
}
void DequePrint(Deque* d)//打印隊(duì)列元素
{
	assert(d);
	DuListNode* cur = d->front;
	DuListNode* tail = d->rear;
	printf("隊(duì)頭:");
	while (cur != tail->next)
	{
		printf("%d<=>", cur->data);
		cur = cur->next;
	}
	printf("隊(duì)尾\n");
}
void DequeDestroy(Deque* d)//銷(xiāo)毀隊(duì)列
{
	assert(d);
	DuListNode* cur = d->front;
	while (cur)
	{
		DuListNode* del = cur;
		cur = cur->next;
		free(del);
		del = NULL;
	}
	d->front = d->rear = NULL;
}

15.2. 循環(huán)隊(duì)

15.2.1. Deque.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int QDataType;
#define MAXSIZE 50  //定義元素的最大個(gè)數(shù)
typedef struct {
    QDataType *data;
    int front;  //頭指針
    int rear;   //尾指針
}Deque;

void DequeInit(Deque* d);//初始化
bool DequeEmpty(Deque* d);//判斷是否為空
bool DequeFull(Deque* d);//判斷隊(duì)列是否滿(mǎn)
QDataType DequeFront(Deque* d);//獲取隊(duì)頭元素
QDataType DequeBack(Deque* d);//獲取隊(duì)尾元素
size_t DequeSize(Deque* d);//獲取隊(duì)列長(zhǎng)度
void DequeFrontPush(Deque* d, QDataType x);//隊(duì)首入隊(duì)
void DequeRearPush(Deque* d, QDataType x);//隊(duì)尾入隊(duì)
void DequeFrontPop(Deque* d);//隊(duì)首出隊(duì)
void DequeRearPop(Deque* d);//隊(duì)尾出隊(duì)
void DequePrint(Deque* d);//打印隊(duì)列元素
void DequeDestroy(Deque* d);//銷(xiāo)毀隊(duì)列
15.2.2. Deque.c
void DequeInit(Deque* d)//初始化
{
	d->data = (QDataType*)malloc(sizeof(QDataType )* MAXSIZE);
	if (d->data == NULL)
	{
		perror("malloc fail:");
		return;
	}
	d->front = 0;
	d->rear = 0;
}
bool DequeEmpty(Deque* d)//判斷是否為空
{
	assert(d);
	return d->front == d->rear;
}
bool DequeFull(Deque* d)//判斷隊(duì)列是否滿(mǎn)
{
	assert(d);
	return (d->rear + 1) % MAXSIZE == d->front;
}
QDataType DequeFront(Deque* d)//獲取隊(duì)頭元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->data[d->front];
}
QDataType DequeBack(Deque* d)//獲取隊(duì)尾元素
{
	assert(d);
	assert(!DequeEmpty(d));
	return d->data[(d->rear-1+MAXSIZE)%MAXSIZE];
}
size_t DequeSize(Deque* d)//獲取隊(duì)列長(zhǎng)度
{
	assert(d);
	return (d->rear - d->front + MAXSIZE) % MAXSIZE;
}
void DequeFrontPush(Deque* d, QDataType x)//隊(duì)首入隊(duì)
{
	assert(d);
	if (DequeFull(d))
	{
		printf("隊(duì)列已滿(mǎn)\n");
		return;
	}
	d->data[(d->front - 1 + MAXSIZE) % MAXSIZE]=x;
	d->front = (d->front - 1 + MAXSIZE) % MAXSIZE;
}
void DequeRearPush(Deque* d, QDataType x)//隊(duì)尾入隊(duì)
{
	assert(d);
	if (DequeFull(d))
	{
		printf("隊(duì)列已滿(mǎn)\n");
		return;
	}
	d->data[d->rear] = x;
	d->rear = (d->rear + 1) % MAXSIZE;
}
void DequeFrontPop(Deque* d)//隊(duì)首出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	d->front = (d->front + 1) % MAXSIZE;
}
void DequeRearPop(Deque* d)//隊(duì)尾出隊(duì)
{
	assert(d);
	assert(!DequeEmpty(d));
	d->rear = (d->rear - 1+MAXSIZE) % MAXSIZE;
}
void DequePrint(Deque* d)//打印隊(duì)列元素
{
	assert(d);
	int cur = d->front;
	printf("隊(duì)頭->");
	while (cur != d->rear)
	{
		printf("%d->", d->data[cur]);
		cur = (cur + 1) % MAXSIZE;
	}
	printf("隊(duì)尾\n");

}
void DequeDestroy(Deque* d)//銷(xiāo)毀隊(duì)列
{
	assert(d);
	free(d->data);
	d->data = NULL;
	d->front = d->rear = 0;
}

到了這里,關(guān)于探索數(shù)據(jù)結(jié)構(gòu):特殊的雙向隊(duì)列的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入了解隊(duì)列:探索FIFO數(shù)據(jù)結(jié)構(gòu)及隊(duì)列

    深入了解隊(duì)列:探索FIFO數(shù)據(jù)結(jié)構(gòu)及隊(duì)列

    之前介紹了棧:探索棧數(shù)據(jù)結(jié)構(gòu):深入了解其實(shí)用與實(shí)現(xiàn)(c語(yǔ)言實(shí)現(xiàn)棧) 那就快馬加鞭來(lái)進(jìn)行隊(duì)列內(nèi)容的梳理。隊(duì)列和棧有著截然不同的工作方式,隊(duì)列遵循先進(jìn)先出(FIFO)的原則,在許多場(chǎng)景下都表現(xiàn)出強(qiáng)大的效率和實(shí)用性 源碼可以來(lái)我的github進(jìn)行查找:Nerosts/just-a-tr

    2024年02月03日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】--- 探索棧和隊(duì)列的奧秘

    【數(shù)據(jù)結(jié)構(gòu)】--- 探索棧和隊(duì)列的奧秘

    關(guān)注小莊 頓頓解饞?(?? ? ??)? ??個(gè)人主頁(yè):9ilk ??專(zhuān)欄:數(shù)據(jù)結(jié)構(gòu)之旅 上回我們學(xué)習(xí)了順序表和鏈表,今天博主來(lái)講解兩個(gè)新的數(shù)據(jù)結(jié)構(gòu) — 棧和隊(duì)列 , 請(qǐng)放心食用 對(duì)于這么坨書(shū),我們要拿到最下面的書(shū)是不是要最后才能拿到;而對(duì)于最上面的書(shū)它是最晚放上去的

    2024年04月13日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    朋友們大家好啊,在上節(jié)完成單鏈表的講解后,我們本篇文章來(lái)對(duì) 帶頭循環(huán)雙向鏈表進(jìn)行講解 單鏈表中,一個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的指針,而雙向鏈表除了上述兩個(gè)內(nèi)容,還包括了 指向上一個(gè)節(jié)點(diǎn)的指針 帶頭的雙向鏈表,是指在雙向鏈表的最前端添加了一個(gè) 額

    2024年02月20日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表

    【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表

    作者:舊夢(mèng)拾遺186 專(zhuān)欄:數(shù)據(jù)結(jié)構(gòu)成長(zhǎng)日記 ? 帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單了。 現(xiàn)在我們來(lái)通

    2024年02月11日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    雙向鏈表概念和單向鏈表是一致的,區(qū)別在于雙向鏈表在單向鏈表的基礎(chǔ)上,指針區(qū)域多了一個(gè)指向上一個(gè)節(jié)點(diǎn)的指針。單向鏈表內(nèi)容可以參考我的上一篇文章:http://t.csdn.cn/Iu56H。 基本的數(shù)據(jù)結(jié)構(gòu)如圖所示: 雙向鏈表結(jié)構(gòu)包含了節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容和兩個(gè)指針:指向前一個(gè)節(jié)點(diǎn)

    2024年02月14日
    瀏覽(22)
  • 探索數(shù)據(jù)結(jié)構(gòu):鏈?zhǔn)疥?duì)與循環(huán)隊(duì)列的模擬、實(shí)現(xiàn)與應(yīng)用

    探索數(shù)據(jù)結(jié)構(gòu):鏈?zhǔn)疥?duì)與循環(huán)隊(duì)列的模擬、實(shí)現(xiàn)與應(yīng)用

    隊(duì)列(queue)是一種只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。其嚴(yán)格遵循 先進(jìn)先出(First In First Out) 的規(guī)則,簡(jiǎn)稱(chēng) FIFO 。 隊(duì)頭(Front) :允許刪除的一端,又稱(chēng)隊(duì)首。 隊(duì)尾(Rear) :允許插入的一端。 隊(duì)列與棧類(lèi)似,實(shí)現(xiàn)方式有兩種。一種是以 數(shù)組

    2024年04月08日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表(單向或雙向)

    【數(shù)據(jù)結(jié)構(gòu)和算法】使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表(單向或雙向)

    上文我們通過(guò)結(jié)構(gòu)體的結(jié)構(gòu)實(shí)現(xiàn)了隊(duì)列 、以及循環(huán)隊(duì)列的實(shí)現(xiàn),我們或許在其他老師的教學(xué)中,只學(xué)到了用結(jié)構(gòu)體的形式來(lái)實(shí)現(xiàn)鏈表、隊(duì)列、棧等數(shù)據(jù)結(jié)構(gòu),本文我想告訴你的是,我們 可以使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表、單調(diào)棧、單調(diào)隊(duì)列 目錄 前言 一、用數(shù)組結(jié)構(gòu)的好處 1.數(shù)

    2024年01月20日
    瀏覽(96)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】之雙向鏈表及其實(shí)現(xiàn)!

    【數(shù)據(jù)結(jié)構(gòu)與算法】之雙向鏈表及其實(shí)現(xiàn)!

    ? ????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?個(gè)人主頁(yè):秋風(fēng)起,再歸來(lái)~ ? ?????????????????????????????????????????? ? ? ? ? ? ? ?? ???? ? ? ? ? ? ? ???? ? ? ? ? ? 數(shù)據(jù)結(jié)構(gòu)與

    2024年04月23日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

    【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

    前幾篇文章介紹了怎樣去實(shí)現(xiàn)單鏈表、單循環(huán)鏈表, 這篇文章主要介紹 雙向鏈表 以及實(shí)現(xiàn)雙向鏈表的步驟,最后提供我自己根據(jù)理解實(shí)現(xiàn)雙向鏈表的C語(yǔ)言代碼 。跟著后面實(shí)現(xiàn)思路看下去,應(yīng)該可以看懂代碼,看懂代碼后,就對(duì)雙向鏈表有了比較抽象的理解了,最后自己再

    2024年02月01日
    瀏覽(28)
  • 隊(duì)列——“數(shù)據(jù)結(jié)構(gòu)與算法”

    隊(duì)列——“數(shù)據(jù)結(jié)構(gòu)與算法”

    各位CSDN的uu們你們好呀,又好久不見(jiàn)啦,最近有點(diǎn)擺爛,甚是慚愧!?。。〗裉?,小雅蘭的內(nèi)容是隊(duì)列,下面,讓我們進(jìn)入隊(duì)列的世界吧?。?! 隊(duì)列 隊(duì)列的概念及結(jié)構(gòu) 隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIF

    2024年02月06日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包