最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言深入刨析數(shù)據(jù)結(jié)構(gòu)之棧與鏈棧的設(shè)計(jì)與應(yīng)用

 更新時(shí)間:2022年05月23日 09:58:24   作者:Mi ronin  
棧是限定僅在表尾進(jìn)行插入或刪除操作的線性表,表尾稱為棧頂(top),表頭稱為棧底(bottom)。棧的最主要特點(diǎn)就是“先進(jìn)后出”(FILO),或“后進(jìn)先出”(LIFO)。用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示的棧稱為“鏈?!保湕?duì)應(yīng)于鏈表

一.棧的定義

棧是限定僅在表尾進(jìn)行插入和刪除操作的數(shù)據(jù)結(jié)構(gòu)(受到限制的線性表)。

我們把允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何元素為空棧。

二.棧的特點(diǎn)

后進(jìn)先出

比如word,瀏覽器網(wǎng)頁等一系列軟件中,都有撤銷的操作,就是利用棧的這種方式來實(shí)現(xiàn)的,可能不同軟件的代碼不同,但是他們的原理是一樣的均為:后進(jìn)先出。

三.棧的理解

  • 棧是一個(gè)線性表,有前驅(qū)后繼關(guān)系,只不過這里的表尾指的是棧頂。
  • 棧限制了線性表的插入和刪除位置,這也導(dǎo)致棧底是固定的。
  • 棧的插入操作,叫做進(jìn)棧;可以理解為子彈入彈夾。
  • 棧的刪除操作,叫做出棧;可以理解為子彈出彈夾。

四.鏈棧引入

既然棧是屬于線性表的一種,那么存儲(chǔ)結(jié)構(gòu)也就分為順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ),這里我們著重講解鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。

五.鏈棧定義

棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),簡稱鏈棧。

對(duì)于棧來說,只在棧頂做插入和刪除操作,由于單鏈表有頭指針,棧頂指針也是必須的,那我們干脆就將頭指針和棧頂指針合二為一,將棧頂放在單鏈表的頭部。通常對(duì)于鏈棧是不需要頭結(jié)點(diǎn)的。

對(duì)于鏈棧來說,一般不會(huì)存在棧滿的情況,如果這種事情真的發(fā)生,那么此時(shí)的計(jì)算機(jī)操作系統(tǒng)也將會(huì)面臨死機(jī)崩潰的情況,那就不單單是這個(gè)鏈棧是否溢出的問題了。對(duì)于鏈表來說,鏈表為空的表示是頭結(jié)點(diǎn)指向空,那么對(duì)于鏈棧來講,鏈棧為空就是棧頂指針指向空(top = NULL)。

六.鏈棧的結(jié)構(gòu)體設(shè)計(jì)

代碼如下:

// 鏈棧的存儲(chǔ)結(jié)構(gòu)
typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

七.鏈棧的基本操作

對(duì)于鏈棧來說作為線性表的一種,操作也就那么幾種,這里我們對(duì)以下幾種操作進(jìn)行詳解:初始化,判斷是否為空,入棧,出棧,取棧頂元素等。

7.1鏈棧的初始化

鏈棧的初始化可以理解為構(gòu)造一個(gè)空棧,將棧頂指針top所指頭結(jié)點(diǎn)的指針域置為NULL,因?yàn)榇藭r(shí)棧中還沒有數(shù)據(jù)元素。

代碼如下:

LinkedStack Init_LinkedStack()
{
	LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));  
	                              //棧頂指針變量
	if(top != NULL)
	{
		top->next = NULL;
	}
	return top;
}

7.2鏈棧判空

判斷鏈棧是否為空,只需要判斷棧頂?shù)闹羔樣蚴欠裰赶蚩眨绻赶蚩談t??眨喾匆嗳?。

bool LinkedStack_Empty(LinkedStack top)
{
	if(top->next == NULL)//如果棧頂?shù)闹羔樣蛑赶蚩?,則???
	{
		return True;
	}
	else
	{
		return False;
	}

7.3鏈棧入棧

入棧就是:

  • 先對(duì)數(shù)據(jù)域進(jìn)行賦值;
  • 然后讓新結(jié)點(diǎn)指向棧頂指針;
  • 最后將棧頂指針交給新節(jié)點(diǎn)。

假設(shè)元素值為e的新節(jié)點(diǎn)是s,top為棧頂指針:

代碼如下:

int Push(LinkedStack *s  ,elemtype e)
{
	LinkedStackNode s= (LinkedStackNode )malloc(sizeof(LinkedStackNode));
 s->data=e;
 s->next=s->top;//把當(dāng)前的棧頂元素賦值給新結(jié)點(diǎn)的直接后繼.
 s->top=s;//把新節(jié)點(diǎn)s賦值給棧頂指針
 s->cout++;
 return 1;
}

7.4鏈棧出棧

出棧就是:

  • 將要?jiǎng)h除的元素的值交給臨時(shí)變量,將棧頂指針交給臨時(shí)節(jié)點(diǎn);
  • 將棧頂指針下移;最后釋放臨時(shí)節(jié)點(diǎn)(即完成刪除)。
  • 假設(shè)變量p用來存儲(chǔ)要?jiǎng)h除的棧頂結(jié)點(diǎn),將棧頂指針向下移一位,最后釋放p即可:

代碼如下:

int Pop_LinkedStack(LinkedStack *s,elemtype *e)
{
	LinkedStackNode *p;
	if(stackempty(*s))
		return error;
	*e=s->top->data;
	p=s->top;   //將棧頂結(jié)點(diǎn)賦值給p
	s->top=s->top->next;//使得棧頂結(jié)點(diǎn)指針下移一位,指向后一結(jié)點(diǎn)
	free(p);//釋放結(jié)點(diǎn)
	s->count--;	
	return 1;
	}
}

7.5取棧頂元素

讀取棧頂元素,并返回其值,該操作與出棧的區(qū)別是棧頂元素并不刪除,所以不用修改頭結(jié)點(diǎn)的指針域即可。

int Get_LinkedStack(LinkedStack top,elemtype *x)
{
	if(top->next == NULL)
	{
		return 0;
	}
	else
	{
		*x = top->next->data;
		return 1;
	}
}

八.總結(jié)

對(duì)比順序棧和鏈棧,如果棧的使用過程中元素變化不可預(yù)料,有時(shí)小,有時(shí)大,那么最好用鏈棧;反之,如果他的變化在可控范圍之內(nèi)建議使用順序棧會(huì)更好點(diǎn)。

(小白一位,如有錯(cuò)誤歡迎指正)

到此這篇關(guān)于C語言深入刨析數(shù)據(jù)結(jié)構(gòu)之棧與鏈棧的設(shè)計(jì)與應(yīng)用的文章就介紹到這了,更多相關(guān)C語言棧與鏈棧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語言快速排序三種方法的單趟實(shí)現(xiàn)

    詳解C語言快速排序三種方法的單趟實(shí)現(xiàn)

    本文將通過圖片重點(diǎn)為大家介紹一下C語言中快速排序三種方法的單趟實(shí)現(xiàn):分別是hoare法、挖坑法、雙指針法,文中示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • 剖析C語言關(guān)鍵字之void,const,return

    剖析C語言關(guān)鍵字之void,const,return

    這篇文章主要為大家介紹了C語言關(guān)鍵字之void,const,return,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 詳解C++構(gòu)造函數(shù)

    詳解C++構(gòu)造函數(shù)

    這篇文章主要為大家介紹了C++構(gòu)造函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++類實(shí)現(xiàn)通訊錄功能

    C++類實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C++類實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++?opencv圖像平滑濾波器使用示例

    C++?opencv圖像平滑濾波器使用示例

    這篇文章主要為大家介紹了C++?opencv數(shù)字圖像處理圖像平滑濾波器的使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++如何獲取系統(tǒng)信息 C++獲取IP地址、硬件信息等

    C++如何獲取系統(tǒng)信息 C++獲取IP地址、硬件信息等

    這篇文章主要為大家詳細(xì)介紹了C++如何獲取系統(tǒng)信,C++獲取IP地址、硬件信息等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • VC++簡單實(shí)現(xiàn)關(guān)機(jī)、重啟計(jì)算機(jī)實(shí)例代碼

    VC++簡單實(shí)現(xiàn)關(guān)機(jī)、重啟計(jì)算機(jī)實(shí)例代碼

    這篇文章主要介紹了VC++簡單實(shí)現(xiàn)關(guān)機(jī)、重啟計(jì)算機(jī)實(shí)例代碼,很實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C/C++堆區(qū)專篇精講

    C/C++堆區(qū)專篇精講

    一直以來總是對(duì)這個(gè)問題的認(rèn)識(shí)比較朦朧,我相信很多朋友也是這樣的,總是聽到內(nèi)存一會(huì)在棧上分配,一會(huì)又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看
    2022-10-10
  • C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能詳解

    C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能詳解

    這篇文章主要介紹了C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能,詳細(xì)分析了C語言加密的相關(guān)概念、原理及AES模塊加密具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C語言實(shí)現(xiàn)貪吃蛇游戲演示

    C語言實(shí)現(xiàn)貪吃蛇游戲演示

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)貪吃蛇游戲演示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

黔江区| 玉田县| 沈丘县| 报价| 虎林市| 阿拉善右旗| 永吉县| 团风县| 济阳县| 焉耆| 前郭尔| 黔西县| 武城县| 镇安县| 济阳县| 犍为县| 青阳县| 灵宝市| 龙胜| 吉林省| 呼图壁县| 舟山市| 开鲁县| 岱山县| 玉屏| 丰县| 塘沽区| 上林县| 云浮市| 平乡县| 鱼台县| 金湖县| 岚皋县| 美姑县| 汤原县| 阳信县| 中阳县| 湖北省| 册亨县| 铜山县| 大连市|