三.**實現
棧是一種僅在表尾進行插入或者刪除操作的線性表
。且表的首尾兩端都有特殊的含義:表頭我們一般稱為棧底
,表尾(最後乙個元素的位置)稱為棧頂
,不含元素或者棧底=棧頂
的棧,我們稱之為空棧
。
所以,棧是一種先進後出
的表結構。這種情況,和我們的火車排程站非常相似。
因為棧的內部儲存結構,可以用順序結構,也可以用鏈式結構,但在這部分儲存方式與前面的線性表、單鏈表相似,所以本文採用順序儲存的方法來實現。
對於乙個棧,我們要定義三個部分,乙個是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...