欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例

 更新時(shí)間:2022年03月29日 14:43:51   作者:許同學(xué)。。  
棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解

1.思考-1

為什么棧用數(shù)組來模擬比用鏈表來模擬更優(yōu)一些?

隊(duì)列也可以數(shù)組和鏈表的結(jié)構(gòu)實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組的結(jié)構(gòu),出隊(duì)列在數(shù)組頭上出數(shù)據(jù),效率會(huì)比較低,時(shí)間復(fù)雜度為O(n)。

2.?;静僮鞯膶?shí)現(xiàn)

2.1 初始化棧

void StackInit(stack*ps)
{
	assert(ps);
	ps->_a = (StackDate*)malloc(sizeof(StackDate) * 4);
	ps->_top = 0;
	ps->_capacity = 4;
}

2.2 入棧

void StackPush(stack*ps, StackDate x)
{
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		stack*tmp = (StackDate*)realloc(ps, sizeof(StackDate)*(ps->_capacity) * 2);
		if (NULL == tmp)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		ps = tmp;
		ps->_capacity *= 2;
	}
	ps->_a[ps->_top] = x;
	ps->_top++;
}

2.3 出棧

void StackPop(stack*ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	--ps->_top;
}

注意: 出棧并不是真正意義上的刪除數(shù)據(jù),而是將_top向后挪動(dòng)了一個(gè)位置。

2.4 獲取棧頂數(shù)據(jù)

StackDate StackTop(stack*ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	return ps->_a[ps->_top - 1];
}

2.5 獲取棧中有效元素個(gè)數(shù)

int StackSize(stack*ps)
{
	assert(ps);
	return ps->_top;
}

2.6 判斷棧是否為空

bool StackIsEmpty(stack*ps)
{
	assert(ps);
	return ps->_top == 0;
}

2.7 銷毀棧

void StackDestory(stack*ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_top = ps->_capacity = 0;
}

3.測(cè)試

3.1 測(cè)試

void test()
{
	//插入數(shù)據(jù)
	stack  st;
	StackInit(&st);
	StackPush(&st,1);
	StackPush(&st,2);
	StackPush(&st,3);
	StackPush(&st,4);
	while (!StackIsEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");


	//獲取棧頂數(shù)據(jù)
	StackPush(&st, 1);
	StackPush(&st, 2);
	printf("%d ", StackTop(&st));
	printf("\n");

	
	//棧中有效數(shù)據(jù)個(gè)數(shù)
	printf("%d ", StackSize(&st));

	
	//銷毀棧
	StackDestory(&st);
}

3.2 測(cè)試結(jié)果

4.思考-2

為什么隊(duì)列用鏈表模擬比數(shù)組模擬更加合適?

棧的實(shí)現(xiàn)一般可以使用數(shù)組或者鏈表實(shí)現(xiàn),相對(duì)而言數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些。因?yàn)閿?shù)組在尾上插入數(shù)據(jù)的代價(jià)小。

5.隊(duì)列的基本操作實(shí)現(xiàn)

5.1 初始化隊(duì)列

void QueueInit(Queue*pq)
{
	assert(pq);
	pq->_head = pq->_tail = NULL;
}

5.2 隊(duì)尾入隊(duì)列

void QueuePush(Queue*pq, QueueDate x)
{
	assert(pq);
	QueueNode*newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NULL == newnode)
	{
		printf("malloc failed\n");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->val = x;
	if (NULL == pq->_tail)
	{
		pq->_head = pq->_tail = newnode;
	}
	else
	{
		pq->_tail->next = newnode;
		pq->_tail = newnode;
	}
}

5.3 隊(duì)頭出隊(duì)列

void QueuePop(Queue*pq)
{
	assert(pq);
	assert(!QueueIsEmpty(pq));
	if (NULL == pq->_head->next)
	{
		free(pq->_head);
		pq->_head = pq->_tail = NULL;
		
	}
	else
	{
		QueueNode*next = pq->_head->next;
		free(pq->_head);
		pq->_head = next;
	}
}

代碼分析:

5.4 隊(duì)列中有效元素的個(gè)數(shù)

int QueueSize(Queue*pq)
{
	assert(pq);
	int count = 0;
	QueueNode*cur = pq->_head;
	while (cur)
	{
		++count;
		cur = cur->next;
	}
	return count;
}

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

bool QueueIsEmpty(Queue*pq)
{
	assert(pq);
	return pq->_head == NULL;
}

5.6 獲取隊(duì)頭數(shù)據(jù)

QueueDate QueueFront(Queue*pq)
{
	assert(pq);
	assert(!QueueIsEmpty(pq));
	return pq->_head->val;
}

5.7 獲取隊(duì)尾的數(shù)據(jù)

QueueDate QueueBack(Queue*pq)
{
	assert(pq);
	assert(!QueueIsEmpty(pq));
	return pq->_tail->val;
}

5.8 銷毀隊(duì)列

void QueueDestory(Queue*pq)
{
	assert(pq);
	while (pq->_head)
	{
		if (pq->_head == pq->_tail)
		{
			free(pq->_head);
			pq->_head = pq->_tail = NULL;
		}
		else
		{
			QueueNode*next = pq->_head->next;
			free(pq->_head);
			pq->_head = next;
		}
	}
}

注意: 和隊(duì)頭出隊(duì)列一樣分析。

6.測(cè)試

6.1 測(cè)試

void test1()
{
	//插入數(shù)據(jù)
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);


	//有效數(shù)據(jù)的個(gè)數(shù)
	printf("%d ", QueueSize(&q));
	printf("\n");


	//獲取隊(duì)頭數(shù)據(jù)
	printf("%d",QueueFront(&q));
	printf("\n");


	//獲取隊(duì)尾數(shù)據(jù)
	printf("%d",QueueBack(&q));
	printf("\n");


	//出隊(duì)
	QueuePop(&q);
	while (!QueueIsEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	printf("\n");


	//銷毀
	QueueDestory(&q);
	printf("\n");
}

6.2 測(cè)試結(jié)果

今天數(shù)據(jù)結(jié)構(gòu)棧與隊(duì)列的相關(guān)知識(shí)點(diǎn)就分享到這里了,感謝你的瀏覽,如果對(duì)你有幫助的話,可以給個(gè)關(guān)注,順便來個(gè)贊。

到此這篇關(guān)于C語言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例的文章就介紹到這了,更多相關(guān)C語言 棧與隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java C++ 算法題解leetcode1608特殊數(shù)組特征值

    Java C++ 算法題解leetcode1608特殊數(shù)組特征值

    這篇文章主要為大家介紹了Java C++ 算法題解拓展leetcode1608特殊數(shù)組特征值實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • C語言深入探究冒泡排序與堆排序使用案例講解

    C語言深入探究冒泡排序與堆排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言冒泡排序與堆排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C++中的函數(shù)指針與函數(shù)對(duì)象的總結(jié)

    C++中的函數(shù)指針與函數(shù)對(duì)象的總結(jié)

    以下是對(duì)C++中的函數(shù)指針與函數(shù)對(duì)象的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++臨時(shí)性對(duì)象的生命周期詳細(xì)解析

    C++臨時(shí)性對(duì)象的生命周期詳細(xì)解析

    臨時(shí)性對(duì)象的被摧毀,應(yīng)該是對(duì)完整表達(dá)式(full-expression)求值過程中的最后一個(gè)步驟。該完整表達(dá)式造成臨時(shí)對(duì)象的產(chǎn)生
    2013-09-09
  • VC解析XML文件-CMarkup的使用詳解

    VC解析XML文件-CMarkup的使用詳解

    本篇文章是對(duì)VC解析XML文件-CMarkup的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 用C實(shí)現(xiàn)PHP擴(kuò)展 Image_Tool 圖片常用處理工具類的使用

    用C實(shí)現(xiàn)PHP擴(kuò)展 Image_Tool 圖片常用處理工具類的使用

    該擴(kuò)展是基于ImageMagick基礎(chǔ)實(shí)現(xiàn)的,圖片操作調(diào)用的是ImageMagick API
    2013-04-04
  • C++char類型和輸入輸出優(yōu)化

    C++char類型和輸入輸出優(yōu)化

    這篇文章主要介紹了C++char類型和輸入輸出優(yōu)化,char的全稱是character,也就是字符的意思。顧名思義,char類型是專門為了存儲(chǔ)字符而設(shè)計(jì)的。下面我們一起來看看文章的具體內(nèi)容吧
    2021-11-11
  • C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?

    C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?

    這篇文章主要介紹了C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?本文講解了使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)體、為什么要有new、自動(dòng)存儲(chǔ)(自動(dòng)變量、局部變量)、動(dòng)態(tài)存儲(chǔ)、vector和array等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • c++中const的使用詳解

    c++中const的使用詳解

    本篇文章是對(duì)c++中的const的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中map和set的使用及示例

    C++中map和set的使用及示例

    map和set是STL容器中的部分,本文主要介紹了C++中map和set的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評(píng)論