① 棧結構通常採用的兩種儲存結構是和
順序存儲和鏈接存儲,通稱順序隊列和鏈隊列,
是計算機科學中一種特殊的串列形式的抽象數據類型,其特殊之處在於只能允許在鏈表或數組的一端(稱為堆棧頂端指針,英語:top)。
進行加入數據(英語:push)和輸出數據(英語:pop)的運算。另外堆棧也可以用一維數組或鏈表的形式來完成。堆棧的另外一個相對的操作方式稱為隊列。
由於堆棧數據結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
堆棧數據結構使用兩種基本操作:推入(壓棧,push)和彈出(彈棧,pop):
推入:將數據放入堆棧的頂端(數組形式或串列形式),堆棧頂端top指針加一。
彈出:將頂端數據數據輸出(回傳),堆棧頂端數據減一。
(1)棧除了可以順序存儲還有什麼擴展閱讀:
堆棧是一個特定的存儲區或寄存器,它的一端是固定的,另一端是浮動的。對這個存儲區存入的數據,是一種特殊的數據結構。所有的數據存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照「後進先出」的原則存取,位於其中間的元素。
必須在其棧上部(後進棧者)諸元素逐個移出後才能取出。在內存儲器 (隨機存儲器) 中開辟一個區域作為堆棧,叫軟體堆棧; 用寄存器構成的堆棧,叫硬體堆棧。堆棧處理器就是一種硬體堆棧相對寄存器文件處理器來講。
它具有很多優點系統復雜度低;精簡的指令集;晶元面積小;定址方式簡單;代碼體積小;快速的中斷響應,子程序調用能力。這些優點使得堆棧處理器在工業控制領域和航空航天領域有著不可替代的地位。
② 棧的存儲結構
棧同順序表和鏈表一樣,棧也是用來存儲邏輯關系為 "一對一" 數據的線性存儲結構。
棧的具體實現
棧是一種 "特殊" 的線性存儲結構,因此棧的具體實現有以下兩種方式:
順序棧:採用順序存儲結構可以模擬棧存儲數據的特點,從而實現棧存儲結構;
鏈棧:採用鏈式存儲結構實現棧結構;
棧存儲結構與之前所學的線性存儲結構有所差異,這緣於棧對數據 "存" 和 "取" 的過程有特殊的要求:
棧只能從表的一端存取數據,另一端是封閉的;
在棧中,無論是存數據還是取數據,都必須遵循"先進後出"的原則,即最先進棧的元素最後出棧。
通常,棧的開口端被稱為棧頂;相應地,封口端被稱為棧底。因此,棧頂元素指的就是距離棧頂最近的元素。
③ 給出棧的兩種存儲結構的形式名稱,在這兩種棧的存儲結構中如何判別棧空與棧滿
【解答】(1)順序棧 (top用來存放棧頂元素的下標)
判斷棧S空:如果S->top==-1表示棧空。
判斷棧S滿:如果S->top==Stack_Size-1表示棧滿。 (2) 鏈棧(top為棧頂指針,指向當前棧頂元素前面的頭結點) 判斷棧空:如果top->next==NULL表示棧空。
判斷棧滿:當系統沒有可用空間時,申請不到空間存放要進棧的元素,此時棧滿。
④ 有哪幾種進棧的方式
序列個數太多,以123為例:123進棧,出棧321;1進棧,1出棧,2進棧,2出棧,3進棧,3出棧,所以是123,以此類推。
4個元素的全排列共有24種,棧要求符合後進先出,按此衡量排除後即得:
1234√ 1243√ 1324√ 1342√ 1423× 1432√
2134√ 2143√ 2314√ 2341√ 2413× 2431√
3124× 3142× 3214√ 3241√ 3412× 3421√
4123× 4132× 4213× 4231× 4312× 4321√
14種可能,10種不可能,如上所示。
(4)棧除了可以順序存儲還有什麼擴展閱讀:
棧的順序存儲結構是利用內存中的一片起始位置確定的連續存儲區域來存放棧中的所有元素,另外為了指示棧頂的准確位置,還需要引入一個棧頂指示變數top,採用順序存儲結構的棧稱為順序棧(sequence stack)。設數組data[MAXSIZE]為棧的存儲空間,其中MAX-SIZE是一個預先設定的常數,為允許進棧結點的最大可能數目,即棧的容量。
初始時棧空,top等於0。當top不等於0時,data[0]為棧底元素,即為當前停留在棧中時間最長的元素;而data[top-1]為最後入棧的元素,即為棧頂元素。
⑤ 棧只能順序存儲嗎
自動變數都是在棧里申請內存的,棧只能按順序使用內存,先定義的變數在棧低,後定義的在棧頂。。。窄想釋放一個內存,只能釋放棧頂,其他位置不行,所以棧內內存都是連續的,不會像堆一樣想釋放誰釋放誰,使用中的內存不連續。。。。
⑥ 棧結構通常採用的兩種儲存結構是和
鏈接存儲:鏈棧
帶有頭指針或頭結點的單循環鏈表。
順序存儲:數組實現,
⑦ 棧只能順序存儲,這句話對嗎,為什麼
棧只能順序存儲,這句話不對。棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom)。
一個新元素只能從棧頂一端進入,刪除時,只能刪除棧頂的元素,即剛剛被插入的元素。所以棧也稱為後進先出表。線性表可以順序存儲,也可以鏈式存儲,因此棧也可以採用鏈式存儲結構。
(7)棧除了可以順序存儲還有什麼擴展閱讀:
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為後進先出表。
在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
棧在程序的運行中有著舉足輕重的作用。最重要的是棧保存了一個函數調用時所需要的維護信息,這常常稱之為堆棧幀或者活動記錄。堆棧幀一般包含如下幾方面的信息:
1、函數的返回地址和參數。
2、臨時變數:包括函數的非靜態局部變數以及編譯器自動生成的其他臨時變數。
鏈式存儲結構的特點:
1、比順序存儲結構的存儲密度小(鏈式存儲結構中每個結點都由數據域與指針域兩部分組成,相比順序存儲結構增加了存儲空間)。
2、邏輯上相鄰的節點物理上不必相鄰。
3、插入、刪除靈活 (不必移動節點,只要改變節點中的指針)。
4、查找節點時鏈式存儲要比順序存儲慢。
5、每個節點是由數據域和指針域組成。
6、由於簇是隨機分配的,這也使數據刪除後覆蓋幾率降低,恢復可能提高。
順序存儲結構的主要優點是節省存儲空間,因為分配給數據的存儲單元全用存放結點的數據(不考慮c/c++語言中數組需指定大小的情況),結點之間的邏輯關系沒有佔用額外的存儲空間。
採用這種方法時,可實現對結點的隨機存取,即每一個結點對應一個序號,由該序號可以直接計算出來結點的存儲地址。但順序存儲方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。
參考資料:網路-棧
參考資料:網路-鏈式存儲結構
參考資料:網路-順序存儲結構
⑧ 棧的順序存儲是什麼
由於棧是運算受限的線性表,因此線性表的存儲結構對棧也適用,而線性表有順序存儲和鏈式存儲兩種,所以棧也有順序存儲和鏈式存儲兩種。
1.棧的順序存儲棧的順序存儲是利用一組地址連續的存儲單元依次存放從棧底到棧頂的數據元素,並附設指針top指示棧頂。
2.棧的順序存儲類型定義1)用內存動態分配方式定義棧的順序存儲(1)棧的順序存儲表示。
順序棧本質上是順序表的簡化,由於棧底位置是固定不變的,所以可以將棧底位置設置在存儲空間的基地址上,棧頂位置是隨著進棧和退棧操作而變化的,故用top來指示當前棧頂元素的下一個位置,通常稱top為棧頂指針。
⑨ 棧和鏈表是兩種不同的數據結構嗎
是不同的數據結構不過它們本身是不同的分類通常說的鏈表指的是用鏈式存儲方式存儲的「線性表」因為數據的存儲分兩大類:順序存儲(數組)鏈式存儲(鏈表)而按邏輯分又有:線性表,棧,隊列,樹,圖等棧有順序存儲也有鏈式的,分別為順序棧和鏈棧而線性表也有兩種存儲方式分別叫順序表和鏈表樓上說的先進先出的那叫隊列棧是先進後出而鏈表沒什麼先進先出之類的它可以在任意位置插入所以不能這樣討論⑩ 棧是什麼結構
問題一:棧和隊列都是什麼結構 隊列是先進先出:就像一條路,有一個入口和一個出口,先進去的就可以先出去。
而棧就像一個箱子,後放的在上邊,所以後進先出。
兩者的結構通常採用的兩種存儲結構是順序存儲結構和鏈表存儲結構。
問題二:什麼是棧? 棧的定義:棧是一種特殊的表這種表只在表頭進行插入和刪除操作。因此,表頭對於棧來說具有特殊的意義,稱為棧頂。相應地,表尾稱為棧底。不含任何元素的棧稱為空棧。
棧的邏輯結構:假設一個棧S中的元素為an,an-1,..,a1,則稱a1為棧底元素,an為棧頂元 素。棧中的元素按a1 ,a2,..,an-1,an的次序進棧。在任何時候,出棧的元素都是棧頂元素。換句話說,棧的修改是按後進先出的原則進行的.因此,棧又稱為後進先出(Last In First Out)表,簡稱為LIFO表。所以,只要問題滿足LIFO原則,就可以使用棧。
notice:換句話說,棧就是可以一個元素進後,可以接著進行輸出的表.這道題各個選項的進出次序為:
A:進,出,進,出,進,出,進,進,出,出,進,出,進,出
B:進,進,出,進,出,出,進,進,進,出,出,進,出,出
C:進,出,進,進,進,進,出,出,出,出,進,出,進,出
D:進,進,進,進,出,出,進,進,出,出,出,出,進,出
E:錯誤.原因自己仿照上面做做看.
所以這道題選E.明白了嗎?
問題三:棧的兩種存儲結構各有哪些優缺點 順序 存儲結構:
優點:連續存儲,空間利用率高
缺點:不方便數據的增刪
鏈式存儲結構:
優點:對於數據的增刪比較方便
缺點:浪費空間
問題四:棧是不是順序存儲的線性結構啊? 呃~弄明白兩個概念:存儲結構和邏輯結構。主要的存儲結構是順序存儲和鏈式存儲(基本這兩個就OK了)。而邏輯結構是指線性表(棧、隊列屬於線性表的范疇)、圖、二叉樹等概念。理論上所有的邏輯結構都可以用上面兩種存儲結構在計算機內實現(當然從效率、存儲空間等方面考慮實際實現中不同的邏輯結構採用的存儲結構會有所偏重)~舉個類似的例子:汽車和內燃機,內燃機主要有汽油機和柴油機兩類,汽車有卡車、轎車、客車等,理論上所有的汽車都可以用兩種內燃機做動力,我可以說客車是汽車,客車既可以是汽油機驅動的汽車也可以有柴油機驅動的汽車。所以棧是線性表,但棧既可以用可以順序存儲實現也可以用鏈式存儲實現。
問題五:棧在數據結構中有什麼作用呢 可以實現很多演算法解決一些問題,比如哈夫曼樹中的一種排序可用棧寫,以及拓撲排序等之類的,還可以用棧解決迷宮尋路問題
問題六:棧和隊列數據結構的特點,什麼情況下用到棧,什麼情況下用到隊列(各舉3個例子) 棧:特點就是一個先進後出的結構。
隊列:特點就是一個先進先出的結構。
一般只要你滿足這個特點就可以稱之為棧或隊列。
棧的應用:非常廣泛,在CPU內部就有提供棧這個機制。主要用途:函數調用和返回,數字轉字元,表達式求值,走迷宮等等。在CPU內部棧主要是用來進行子程序調用和返回,中斷時數據保存和返回。在編程語言中:主要用來進行函數的調用和返回。可以說在計算機中,只要數據的保存滿足先進後出的原理,都優先考慮使用棧,所以棧是計算機中不可缺的機制。
隊列的應用:隊列主要用在和時間有關的地方,特別是操作系統中,隊列是實現多任務的重要機制。windows中的消息機制就是通過隊列來實現的。進程調度也是使用隊列來實現,所以隊列也是一個重要的機鄲。只要滿足數據的先進先出原理就可以使用隊列。
問題七:棧的順序存儲結構 這是結果,需要的話給我個郵箱
/*
在vc++6.0中的輸出結果:
------------------------
初始化棧.....
創建一個包含5個不大於100的正整數值的棧(5個值由計算機隨機產生)...
棧中的元素從棧底到棧頂為:41 67 34 0 69
請輸入要插在棧頂的元素e = 100
棧中的元素從棧底到棧頂為:41 67 34 0 69 100
彈出的棧頂元素 e = 100
棧中的元素從棧底到棧頂為:41 67 34 0 69
棧中元素個數是5
輸出從棧頂到棧底的所有元素:69 0 34 67 41
Press any key to continue
--訂---------------------------
*/
問題八:C語言中的棧、堆是什麼? 計算機中的內存分為兩部分:一部分是棧(stack,也稱堆棧),另一部分是堆(heap)。
棧,可以看作是一摞卡片,最上面的卡片表示程序的當前作用域,這往往就是當前正在執行的函數。當前函數中聲明的所有變數都置於棧頂幀中,即佔用棧頂幀的內存,這就相當於一摞卡片中最上面的一張卡片。如果當前函數調用了另一個函數,舉例來說,當前函數foo()調用了另一個函數bar(),就會在這摞卡片上再加一個新的卡片,這樣bar()就有了自己的棧幀(stack frame)以供使用。從foo()傳遞到bar()的所有參數都會從foo()棧幀復制到bar()棧幀中。(註:棧幀很有意義,因為棧幀可以為每個函數提供一個獨立的內存工作區。如果一個變數是在foo()棧幀中聲明的,那麼調用bar()函數不會對它帶來改變,除非你專門要求修改這個變數。另外,foo()函數運行結束時,棧幀即消失,該函數中聲明的所有變數都不會再佔用內存了。)
堆,一段完全獨立於當前函數或者棧幀的內存區。如果一個函數中聲明了一些變數,而且希望當這個函數完成時其中聲明的變數仍然存在,就可以將這些變數置於堆中。 堆和棧相比,沒那麼清晰的結構性。可以把堆可作是一「堆」小玩藝。程序可以在任何時間向這個「堆」增加新的東西,或者修改堆中已有的東西。