堆疊是一種特殊的線性表,是一種線性結構,只能對棧的頂端做操作,操作有入棧和出棧兩種,就是插入和刪除。堆疊一定要遵循先進後出(或叫後入先出)原則,就是最後乙個進去的元素一定是第乙個出來的。那麼堆疊要怎麼實現?
第乙個很簡單的方法就是用乙個一維陣列,因為棧是一種按順序儲存的結構,所以可以用一維陣列來儲存棧的資料。因為棧有乙個特點是後入先出,最後進入的元素最先出來,所以還要有乙個資料來儲存棧中最後乙個元素的位置。所以可以用乙個結構體來表示,結構體成員裡有乙個陣列和乙個表示位置的變數。
建立好棧之後,接下來是入棧
,往裡面放入元素。入棧時通常要做些特殊情況判斷,比如棧滿了的話就不能繼續往裡面放元素了。入棧的部分可以這樣實現:
注意第16行語句是把
ptrp->top++
後,再把
x放在陣列的
top++
的下標位置。
接著是出棧
,把棧裡的元素放出來。出棧同樣要先做特殊判斷,如果棧是空的,就無法放出元素:
包括main函式在內的實現**參考:
小拓展:既然我們可以用乙個結構體來表示乙個棧,那麼如果需要兩個棧,我們可以用兩個結構體。不過我們有沒有更簡單的方法來做呢?我們知道棧的資料儲存在一維陣列中,所以我們可以用乙個一維陣列來儲存兩個棧。這樣:
設定兩個變數top1和
top2
來表示兩個棧的下標。堆疊
1從陣列頭開始往後儲存,堆疊
2從陣列結尾開始往前儲存。
接下來看入棧和出棧如何操作。首先看入棧:
首先還是特殊情況判斷,看陣列是否滿了。因為堆疊1和堆疊
2是分別從陣列兩段開始往中間儲存資料的,所以當陣列滿時,兩個堆疊的
top變數時緊挨著的,所以判斷陣列是否滿了的條件可以是判斷if(
top2-top1
)==1
。這裡引入了乙個choice變數來區分對哪個堆疊進行操作,當
choice等於1
時對堆疊
1進行操作,當
choice等於2
時對堆疊
2進行操作。
到出棧:
同樣有乙個choice來判斷對哪個堆疊進行操作,然後時特殊情況的判斷,對於堆疊
1,因為堆疊
1是從陣列頭開始儲存的,所以堆疊
1為空則
top1
等於-1
;對於堆疊
2,堆疊
2從陣列末尾開始儲存,所以堆疊
2為空則
top2
等於maxsize
。出棧時,對於堆疊
1,出棧後
ptrp->top1--
,是從右到左的下標遞減,而堆疊2是
ptrp->top2++
,從左到右下標遞增。
我們知道用陣列來儲存資料有乙個問題就是陣列的大小實現要設定好。設定太少了到後面儲存資料時會發現陣列不夠大,設定太大了有可能會浪費記憶體。所以我們想更好的方法就是用指標來實現堆疊的儲存。就像指標實現線性表一樣,堆疊也是特殊的線性表,一樣可以用指標來實現。那麼我們來看看**如何寫。
首先定義乙個結構體,就像線性表那樣。
然後就要建立堆疊的頭結點,用malloc申請一塊空間,建立完後我們做個函式來檢查下堆疊是否為空。是就會返回
1,否則返回0。
堆疊建立好後,接著就要往裡面插入結點,即儲存資料了,注意我們的儲存方式和一般普通的單向鍊錶不同,通常我們會把新接入線性表中的資料接到表尾,但在堆疊中我們知道資料的一大特點是先進後出,後入先出。所以資料要怎麼放?新資料還是接在鍊錶尾嗎?其實我們應該把新的節點接到頭指標的後面,這樣每次輸出時就容易很多,直接輸出頭指標的next就可以了。首先看入棧的**我們應該怎麼寫:
每次新錄入乙個結點,malloc申請一塊空間,接入結點到頭結點的下乙個結點,方法是先把新節點的
next
指向頭結點的
next
,然後把頭結點的
next
指向新錄入的結點。
入棧後看下出棧又要怎麼寫?出棧的方式當然就是把入棧的方式倒過來了:
首先做特殊情況判斷,如果堆疊為空,就無法pop出資料。如果堆疊不為空,
pop出結點資料意味著這個結點也會退出線性表,因為退出的結點最後要
free
掉,所以我們先定義乙個該結構體的指標
p指向這個要退出的結點,也就是第
40行。接著讓頭結點指向該退出的結點的下乙個結點(第
41行),再把該退出的結點裡的資料賦值給乙個變數k,
return k
來做出pop
動作,最後再
free掉p
就可以了。
堆疊的順序儲存 順序棧
堆疊的順序儲存結構簡稱順序棧,它是利用一組位址連續的儲存單元依次存放自棧底到棧頂之間的元素。順序棧本質是順序表的簡化,唯一需要確定的是用順序表的那一段表示棧底。通常把順序表的表頭 陣列中下標為0 的一端作為棧底,同時附設指標top指示的棧頂元素在順序表中的位置,top也被成為棧頂指標。由於順序表都是...
堆疊的順序儲存實現
1 define maxsize 儲存資料元素的最大個數 23 typedef struct snode stack 45 struct snode 1 入棧 1 void push stack ptrs,elementtype item 89 else 1617 2 出棧 1 elementtyp...
堆疊的順序儲存實現
1 include2 include3 include4 define max 50 5 define ok 1 6using namespace std 7 typedef int elemtype 8 typedef struct stack 順序棧的定義 9tstack,tnode 1415 ...