資料結構 棧

2022-04-28 02:24:52 字數 4362 閱讀 2694

1.為什麼要學習棧?

棧是什麼?為什麼要學習它?現在先來說說棧的輝煌作用吧!在計算機領域中,棧是一種不可忽略的概念,無論從它的結構上,還是儲存資料方面,它對於學習資料結構的人們來說,都是非常重要的。那麼就會有人問,棧究竟有什麼作用,讓我們這麼重視它?首先,棧具有非常強大的「記憶」功能,它可以儲存對你有作用的資料,也可以被叫做儲存現場;其次,當咱們呼叫乙個帶參函式時候, 被呼叫的函式的形參,在編譯器編譯的時候,這些形參都需要一定的空間存放他們,這時計算機就會預設幫你儲存到棧中了!

2.棧的定義

棧的作用,這是乙個咱們生活中處處用到,但是卻又沒發現的一種現象,例如當你拿個籃子去買蘋果,那麼你最先挑選的蘋果就是在籃子的最底下,最後挑選的蘋果就在籃子的最上邊,那麼這就造成了這麼一種現象:先拿進籃子的蘋果,要最後才能取出來;相反,最後拿進籃子的蘋果,就能最先取出來!

棧是限定只能在表尾進行插入和刪除的線性表。

我們把允許插入和刪除的一端稱作棧頂(top),另一端稱作棧底(bottom)不含任何資料元素的棧被稱作空棧,棧也被稱為先進後出的線性表(具有線性關係)。

而棧的特殊性,就是在表中想進行插入和刪除的操作,只能在棧頂進行。這也就使得了:棧底是非常穩定的,因為先進來的元素都被放在了棧底。

棧的插入操作:叫做進棧,也叫作壓棧,入棧。

棧的刪除操作:叫做出棧,也叫彈棧。

3.進棧出棧變化形式

答案是不一定的,這個問題就要細分情況了。棧對線性表的插入和刪除的位置進行了限制,並沒有對元素的進出時間進行限制,這也就是說,在不是所有元素都進棧的情況下,事先進去的元素也可以先出站,只要確保一點:棧元素是從棧頂出棧就可以了!

舉例來說,現在有3個整型數元素1、2、3依次進棧,會有哪些出棧次序呢?

第一種:1、2、3依次進,再3、2、1依次出棧。這是最簡單也最好理解的一種,出棧順序是321。

第二種:1進,1出,2進,2出,3進,3出。也就是進乙個出乙個,出棧順序123.

第三種:1進,2進,2出,1出,3進,3出。出棧次序為213。

第四種:1進,1出,2進,3進,3出,2出。出棧次序為132。

第五種:1進,2進,2出,3進,3出,1出。出棧次序為231。

現在思考一下,有沒有312這樣的出棧次序?

答案是肯定不會的。因為3先出棧,就意味著3曾經進棧,既然3都進棧了,那就意味著1、2已經進棧了,此時,2一定是在1的上面,就是更接近棧頂,那麼出棧只能是321,不然不滿足123依次進棧的要求,所以此時不會發生1比2先出棧的情況。

上述的這個簡單例子,就可以看出來,只是3個棧元素,就有5種可能的出棧次序,如果元素量多,那麼出棧的變化將會更多。

對於棧來講,理論上線性表的操作特性它都具備,但是由於它的特殊性,所以針對它的操作上,也會有些變化。特別是插入和刪除的操作,我們改名為push和pop,英文翻譯為壓和彈!

由於棧也是線性表,那麼咱們之前講的線性表的順序儲存和鏈式儲存,對於棧來說,必然也是同樣適用的!

既然棧是線性表的特例,那麼棧的順序儲存其實也是線性表順序儲存的簡化,我們簡稱為順序棧。線性表是用陣列來實現的,那麼對於棧這種只能一頭進行插入和刪除的線性表來說,咱們一般也是用陣列下標為0的一端,作為棧底。

那麼此時,我們定義乙個stacksize表示陣列的元素個數,top變數來指示棧頂元素在陣列中的位置,那麼就意味著top可以變大變小。如果此棧存在元素,那麼top必然要小於stacksize,棧為空則top=-1,棧存在乙個元素,top=0。

棧的結構定義:

typedef int selemtype; /* selemtype 型別根據實際情況而定,這裡假設為int */

typedef struct

selemtype data[maxsize];

int top; /* 棧頂指標 */

}sqstack;

1.棧的順序儲存結構進棧操作

若現在有乙個棧,stacksize是5,那麼棧的普通情況、空棧、滿棧的情況分別如下:

對於棧的插入,即進棧操作,有如下所示:

因此對於進棧的操作push,其**如下:

/*

插入元素e為新的棧頂元素

*/status push(sqstack *s,selemtype e)

s->top++; /*

棧頂指標增加一

*/s->data[s->top] = e; /*

將新元素e插入並賦值給棧頂空間

*/return

ok;}

1.棧的順序儲存結構出棧操作對於棧的刪除,即出棧操作,有如下**:

/*

先判斷棧是否為空,不空則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error

*/statck pop(sqstack *s, selemtype *e)

1.棧出鏈式儲存結構棧的鏈式儲存結構,簡稱為鏈棧。鏈棧簡單的講,就是將棧和鍊錶合二為一的使用,那麼此時為了簡單,通常就把棧頂放在了鍊錶的頭指標位置,此時棧頂指標就替代了頭指標,那麼此時資料依次從棧頂進入,而且此時對於鍊錶來說也就不再需要頭結點了。

對於鏈棧來說,鏈棧的操作絕大部分都和單鏈表類似,而且基本上不存在棧滿的情況,除非記憶體已經沒有可以使用的空間。

對於空棧來說,鍊錶原定義是頭指標指向空,那麼鏈棧的空其實就是top=null的時候。

對比一下順序棧與鏈棧,它們在時間複雜度上是一樣的,均為o(1)。對於空間效能,順序棧需要事先確定乙個固定的長度,可能會存在記憶體空間浪費的問題,但它的優勢是訪問時定位很方便,而鏈棧則要求每個元素都有指標域,這同時也增加了一些記憶體開銷,但對於棧的長度無限制。所以它們的區別和線性表中討論的一樣。如果棧的使用過程中元素變化不可預料,有時很小,有時非常大,那麼最好是用鏈棧,反之,如果它的變化在可控的範圍內,建議使用順序棧會更好一些。

/*

note:your choice is c ide

*/#include

"stdio.h

"#include

"stdlib.h

"typedef

struct

personperson;

person *head;

void main()//

棧頂是頭指標

else

break

;

case2:

if(head==null)

pa=head;

pb=head->next;

head=head->next;

printf(

"-%d-

",pa->arr);

free

(pa);

break

;

case3:

pa=head;

printf(

"\n列印從棧頂到棧底的元素\n");

while

(pa)

printf("\n

");break

; }}}

#include "

stdio.h

"#define max 5typedef

struct

personperson;

person p;

void main(void

)else

break

;

case2:

e=p.arr[p.top];

printf(

"刪除的元素是%d\n

",e);

p.top--;

break

;

case3:

printf(

"\n列印從棧頂到棧底的元素\n");

for(i=p.top;i>=0;i--)

printf("\n

");break

; }}}

資料結構 棧 棧

可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...

資料結構 棧

例子 棧是一種被限制在只能在表的一端進行插入和刪除運算的線性表。區域性變數是用棧來儲存的 可以進行插入和刪除的一端稱為 棧頂 top 另一端稱為 棧底 bottom 當表中沒有元素時 表長為0的棧 稱為 空棧。棧的修改是按 後進先出的原則進行,因此棧被稱為後進先出 last in first out...

資料結構 棧

1.棧stack 是限定僅在表尾進行刪除和插入操作的線性表。允許插入刪除的一端叫做棧頂top,另外一端叫做棧底bottom。棧又稱為後進先出 lifo 的線性表。即表尾是指棧頂。2.順序棧 定義 top指向可存入元素的位置。typedef struct stacktypestacktype 插入 進...