資料結構學習記錄5 棧(順序棧)

2021-10-10 02:13:22 字數 2267 閱讀 8166

三.**實現

棧是一種僅在表尾進行插入或者刪除操作的線性表。且表的首尾兩端都有特殊的含義:表頭我們一般稱為棧底,表尾(最後乙個元素的位置)稱為棧頂,不含元素或者棧底=棧頂的棧,我們稱之為空棧

所以,棧是一種先進後出的表結構。這種情況,和我們的火車排程站非常相似。

因為棧的內部儲存結構,可以用順序結構,也可以用鏈式結構,但在這部分儲存方式與前面的線性表、單鏈表相似,所以本文採用順序儲存的方法來實現。

對於乙個棧,我們要定義三個部分,乙個是base作為我們基礎的「容器」存放我們的資料,然後還得要有乙個top棧頂指標,來指向我們當前的棧頂元素,因為是順序表,所以我們還得有乙個maxlen來儲存base的最大長度,以免越界。top可以是乙個整形,通過base+top的方式,得到棧頂指標,當然,也可以直接將top宣告成和base相同的類,然後存放棧頂的指標。因為本來就是順序表,所以越簡單越好,所以採用整形的方式去儲存。

對於棧的初始化,我們只用申請乙個預設長度的空間,賦值給base,然後將maxlen更新至我們初始化的長度,最後top=0,也就是指向了base

直接free掉我們的base

我們直接判斷top==0

因為是順序儲存結構,所以並不需要去遍歷整個表,直接返回top,棧頂指標,就是我們的棧的長度了。

如果棧不為空,那麼返回*(base+top)的值就行

我們只需要更新棧頂的指標位置,並賦上我們要壓入的值,這樣元素就入棧了。

當然,我們得判斷base的儲存空間夠不夠,如果不夠還需要realloc base,以免造成越界。按照我的習慣,我喜歡入了棧後再檢查並擴容,做好主準備。

返回當前棧頂指標指向的位址的值,然後將棧頂指標-1

因為只要知道原理了,那麼實現起來就比較簡單,所以就不怎麼新增注釋了。

#include

#include

#define ok 1

#define error 0

#define default_len 20

#define extend_len 5

typedef

struct elemtypeelemtype;

typedef

struct stackstack;

stack*

stackinit

(void);

intgettop

(stack *s, elemtype *elem)

;int

push

(stack* s, elemtype elem)

;elemtype pop

(stack* s)

;int

isempty

(stack *s)

;int

main()

return0;

}stack*

stackinit

(void

) s->base =

(elemtype *

)malloc

(sizeof

(elemtype)

*default_len)

; s->top =0;

s->maxlen = default_len;

if(s->base !=

null

)else

}int

gettop

(stack *s, elemtype *elem)

else

}int

push

(stack *s, elemtype elem)

else}}

else

}elemtype pop

(stack* s)

else

}int

isempty

(stack *s)

else

}

資料結構學習筆記5(棧)

在學習組合語言時候曾經簡要接觸過棧。棧可能是繼陣列之後在技術安吉科學中最基本的資料結構。基本思想是先進先出,可以看做是乙個桶。最先進入的最後出,最後進的最先出。棧可以用鍊錶或者陣列實現。陣列實現的缺點在於需要提前預知棧的大小,並定義出來 但是,一般在應用程式中,即使有相當多的棧操作,在任意時刻站元素...

資料結構學習 棧

這一系列部落格的目的在於複習鞏固資料結構的基礎知識,為考研面試筆試做準備,所以重在原理,實踐不是重點。參考書籍有嚴蔚敏老師的 資料結構 c語言版 c c 資料結構與演算法速學速用大辭典 define stacksize 100 typedef int datatype typedef structs...

資料結構學習 順序棧 Java實現

棧抽象資料結構 棧介面,描述棧抽象資料型別,泛型引數t表示資料元素的資料型別 package com.clarck.datastructure.stack 棧抽象資料結構 棧介面,描述棧抽象資料型別,泛型引數t表示資料元素的資料型別 author clarck param public inte c...