棧是一種特殊的表,這種表只在表首進行插入和刪除操作。因此,表首對棧來說具有特殊的意義,稱為棧頂。表尾稱為棧底。不含任何元素的棧稱為空棧。
假設乙個棧s中的元素為a(n),a(n-1),…,a(1),則稱a(1)為棧底元素,a(n)為棧頂元素。棧中元素按a(1),a(2),……,a(n)的次序進棧。在任何時候,出棧的元素都是棧頂元素。換句話說,棧的修改是按後進先出的原則進行的。因此,棧又稱為後進先出(last in first out) 表, 簡稱為lifo表。
棧也是乙個抽象資料型別。常用的棧運算如下。
(1) stackempty(s):測試棧s是否為空。
(2) stackfull(s) :測試棧s是否已滿。
(3) stacktop(s) :返回棧s的棧頂元素。
(4) push(x, s) :在棧s的棧頂插入元素x, 簡稱為將元素x入棧。
(5) pop(s) :刪除並返回棧s的棧頂元素, 簡稱為拋棧。
棧的應用非常廣泛, 只要問題滿足lifo原則, 就可以使用棧。
用乙個陣列data儲存棧元素時,棧底固定在陣列的底部,即data[0]為最早入棧的元素,並讓棧向陣列上方(下標增大的方向)擴充套件。
stack定義如下。
typedef
struct astack *stack;
//棧指標型別
typedef
struct astack;
//棧結構
int top,
//棧頂
maxtop;
//棧空間上界
stackitem *data;
//儲存棧元素的陣列
}sstack;
棧元素儲存在陣列data中,用top指向當前棧頂位置,棧頂元素儲存在data[top]中,棧的容量為maxtop。
將棧元素的型別定義為int。
typedef
int stackitem;
//棧元素型別int
typedef stackitem *addr;
//棧元素指標型別
建立乙個容量為size的空棧。
stack stackinit
(int size)
當top=-1時當前棧為空棧。
int
stackempty
(stack s)
當top=maxtop時當前棧滿。
int
stackfull
(stack s)
棧頂元素儲存在data[top]中。
stackitem stacktop
(stack s)
新棧頂元素x應儲存在data[top+1]中。
void
push
(stackitem x,stack s)
刪除棧頂元素後,新棧頂元素在data[top-1]中。
stackitem pop
(stack s)
由於陣列data是動態分配的,在使用結束時應由stackfree釋放分配給data的空間,以免產生記憶體洩漏。
void
stackfree
(stack s)
在一些演算法中使用棧時,常需要同時使用多個棧。為了使每個棧在演算法執行過程中不會溢位,通常要為每個棧預置乙個較大的棧空間。但做到這一點並不容易,因為各個棧在演算法執行過程中實際所用的最大空間很難估計。另一方面,各個棧的實際大小在演算法執行過程中不斷變化,經常會發生其中乙個棧滿,而另乙個棧空的情形。
]假設讓程式中的兩個棧共享乙個陣列data[0:n] 。利用棧底位置不變的特性,可以將兩個棧的棧底分別設在陣列data的兩端,然後各自向陣列data的中間伸展。這兩個棧的棧頂初值分別為0和n,當兩個棧的棧頂相遇時才可能發生上溢。由於兩個棧之間可以互補餘缺,每個棧實際可用的最大空間往往大於n/2。
共享同一陣列空間的兩個棧
用指標實現棧,稱為鏈棧,如下圖。
//棧結點指標型別
typedef
struct snodestacknode;
slink newstacknode()
其資料成員element儲存棧元素,next是指向下乙個結點的指標,函式newstacknode()建立乙個新結點。
typedef
struct lstack *stack;
//棧指標型別
typedef
struct lstacklstack;
top是指向棧頂結點的指標。
函式stackinit()將top置為空指標,建立乙個空棧。
stack stackinit()
檢測指向棧頂的指標top是否為空指標。
int
stackempty
(stack s)
返回棧s的棧頂結點中的元素。
stackitem stacktop
(stack s)
函式push(x,s)先為元素x建立乙個新結點,然後修改s的棧結點指標top使新結點成為新棧頂結點。
void
push
(stackitem x,stack s)
函式pop(s)先將s的棧頂元素存於x中,然後修改棧頂指標使其指向棧頂元素的下乙個元素,從而刪除棧頂元素,最後返回x。
stackitem pop
(stack s)
C語言描述 棧結構
鏈式棧對於棧的使用常常使用陣列結構進行實現,因為棧和順序線性表很大區別就在於棧只用對頂部元素進行增刪操作即可,和順序線性表一旦增刪就要改動很大的特點有了很大優化。int isempty stack s int isfull stack s,int maxsize stack creatstack i...
用C語言描述資料結構
用c語言描述資料結構 學好計算機,主要要從三個方面做起,其中,第一步就是要學好各種語言,這是第一步,對各種語言有乙個大體的了解 然後就是資料結構了,它是計算機中的一門核心的課程,也是一門資訊計算 在最後本人認為就是演算法了,它也是這三部中最難得一步了,要學好計算機,做一名優秀的程式元,這三步是最基本...
c語言描述資料結構應用
學生的學號 姓名 根據輸入資料建立一棵二叉樹 第乙個輸入資料作為根節點 要求 左子樹節點的學號總比根節點小,右子樹節點的學號總比根節點大。1 鍵盤輸入你所在宿舍的同學資訊到二叉樹 2 按學號大小輸出所有同學資訊 3 給定學號,查詢該學號同學的姓名 樹的操作 include stdio.h inclu...