c語(yǔ)言棧的實(shí)現(xiàn)完整程序 C語(yǔ)言中堆和棧的區(qū)別?
C語(yǔ)言中堆和棧的區(qū)別?在數(shù)據(jù)結(jié)構(gòu)中,堆和棧的原理幾乎是先入后出,但堆一般是一個(gè)二叉樹(shù),這是非線(xiàn)性的,比如堆排序。堆棧往往是線(xiàn)性的。堆和堆棧是C語(yǔ)言?xún)?nèi)存管理的兩個(gè)不同部分。堆棧空間由操作系統(tǒng)管理、分配和
C語(yǔ)言中堆和棧的區(qū)別?
在數(shù)據(jù)結(jié)構(gòu)中,堆和棧的原理幾乎是先入后出,但堆一般是一個(gè)二叉樹(shù),這是非線(xiàn)性的,比如堆排序。堆棧往往是線(xiàn)性的。
堆和堆棧是C語(yǔ)言?xún)?nèi)存管理的兩個(gè)不同部分。
堆棧空間由操作系統(tǒng)管理、分配和釋放。普通的局部變量存儲(chǔ)在堆棧上。
堆區(qū)域中的空間由用戶(hù)自己分配和管理。例如,每個(gè)malloc必須是自由的。否則操作系統(tǒng)不會(huì)為您發(fā)布它。
C語(yǔ)言還有一個(gè)代碼段,在程序執(zhí)行后不可寫(xiě),通常用于存儲(chǔ)常量。
從一個(gè)棧創(chuàng)建一個(gè)隊(duì)列,使棧頂為隊(duì)列的頭,棧底為隊(duì)列的尾,最后要求使棧成為空棧 (用C語(yǔ)言實(shí)現(xiàn))?
這里我用C語(yǔ)言實(shí)現(xiàn)了堆棧,代碼附在文本上。
1. 堆棧表示
堆棧遵循先入后出的原則,所以我們需要頂部和底部指針。讓我們用len表示當(dāng)前堆棧中有多少元素,用stack size表示堆棧可以存儲(chǔ)多少元素。以整數(shù)為例。
2. 要?jiǎng)?chuàng)建堆棧,使用malloc函數(shù)分配空間,使基指針指向空間的起始位置,并將頂部指針設(shè)置為底部指針。設(shè)len為0,stacksize為初始堆棧的最大值。這樣,堆棧就被初始化了。注意:Max_u2;在進(jìn)入堆棧時(shí),我們首先考慮堆棧是否已滿(mǎn)。如果已經(jīng)滿(mǎn)了,我們需要增加分配的空間。Realloc函數(shù)可以用來(lái)動(dòng)態(tài)分配空間。具體用途可在線(xiàn)查詢(xún)。然后將stack元素指定給top指針指向的空間,并設(shè)置top 1。這樣,就完成了一個(gè)堆棧條目。
4. 離開(kāi)堆棧前檢查堆棧是否為空。如果為空,則會(huì)報(bào)告錯(cuò)誤。如果不為空,則堆棧頂部指針將減少1(此處的堆棧頂部指針指向要放入堆棧的空間,因此離開(kāi)堆棧時(shí)將減少1)。然后將指向空間的上指針的值賦給容器,并將長(zhǎng)度減少1。
5. 銷(xiāo)毀堆棧。銷(xiāo)毀堆棧時(shí),釋放malloc分配的空間。注意:免費(fèi)(s->base)是可以的。如果循環(huán)釋放free(s->base),將報(bào)告錯(cuò)誤。原因:基址沒(méi)有指向malloc分配的地址。
6. difference&*&是地址符號(hào),*是內(nèi)容符號(hào)。在指針中,這兩個(gè)符號(hào)非常重要。當(dāng)我們需要更改函數(shù)的外部參數(shù)的值時(shí),我們需要傳入變量的地址而不是值。例如,如果我需要更改int a的值,我需要這樣寫(xiě):通過(guò)這種方式,我可以理解為什么在前面的函數(shù)中直接使用stack*s而不是stack s,因?yàn)橹苯觽鬟f的s不能更改s中元素的值。
7。區(qū)分->和。在C語(yǔ)言中->前面是指針和。前面是結(jié)構(gòu)變量。因此,當(dāng)函數(shù)傳入結(jié)構(gòu)指針時(shí)使用s->len,當(dāng)函數(shù)傳入結(jié)構(gòu)變量時(shí)使用s.len。