實現方法:
(1)構建乙個節點結構體只含有指標域;
(2)構建乙個鍊錶結構體,包含頭節點和鍊錶的大小;
(3)使用者使用時需要預留出指標域的記憶體空間。
/*節點結構體*/
typedef
struct linknode
linknode;
/*鍊錶結構體*/
typedef
struct liststack
liststack;
為了避免使用者通過鍊錶位址而對鍊錶進行操作,需要封裝建立的鍊錶資料型別。
(1)void*型別是萬能型別,可以將任何型別轉為void*
,需要使用時可將void*
型別轉回為已知型別。
typedef
void
* lstack;
申請棧空間;
初始化棧中的頭節點和棧大小;
將型別封裝後的申請的棧位址返回。
/*初始化棧*/
lstack init_liststack()
入棧的本質就是頭插或者尾插節點。
將封裝的棧位址的型別轉為原型別;
取出使用者資料中的前四位元組的指標域;
判斷當前的棧是否已滿:
(1)若已滿則返回;
(2)若未滿則頭插;
更新棧的大小
/*入棧:頭插*/
void
push_liststack
(lstack pstack,
void
* pdata)
if(pdata ==
null
) liststack* stack = pstack;
linknode* data = pdata;
//1.判斷棧是否已滿
if(stack->m_size == max)
//2.入棧
data->next = stack->pheader.next;
stack->pheader.next = data;
stack->m_size++
;}
出棧的本質就是頭刪或者尾刪節點。
將封裝的棧位址的型別轉為原型別;
取出使用者資料中的前四位元組的指標域;
判斷當前的棧是否為空:
(1)若已空則返回;
(2)若未空則頭刪;
更新棧的大小
/*出棧:頭刪*/
void
pop_liststack
(lstack pstack)
liststack* stack = pstack;
if(stack->m_size ==0)
linknode* pcurrent = stack->pheader.next;
stack->pheader.next = pcurrent->next;
stack->m_size--
;}
將封裝的棧位址的型別轉為原型別;
取出使用者資料中的前四位元組的指標域;
使用者將返回的指標轉為自己的資料型別指標。
void
*top__liststack
(lstack pstack)
liststack* stack = pstack;
linknode* pcurrent = stack->pheader.next;
if(stack->m_size ==0)
return pcurrent;
}
直接判斷鍊錶結構體中的鍊錶大小是否是0;
/*判斷是否為空*/
intempty__liststack
(lstack pstack)
liststack* stack = pstack;
if(stack->m_size ==0)
return0;
}/*返回棧大小*/
intret__liststack
(lstack pstack)
liststack* stack = pstack;
return stack->m_size;
}
釋放棧的空間
注意不能釋放節點空間,因為節點中的資料域是使用者的資料。
/*銷毀棧*/
void
destory_liststack
(lstack pstack)
free
(pstack)
; pstack =
null
;}
定義陣列的結構體,包含陣列的屬性
(1)陣列的首位址
(2)陣列的容量
(3)陣列的大小
/*順序棧結構體*/
typedef
struct arraystack
arraystack;
封裝資料型別
typedef
void
* arrstack;
申請棧的空間;
初始化棧的成員;
(1)申請並初始化陣列;
(2)陣列的大小;
(3)陣列的容量;
返回被封裝的棧的位址。
/*初始化棧*/
arrstack init_arraystack
(int capacity)
//1.初始化棧
申請空間
arraystack* stack =
malloc
(sizeof
(arraystack));
初始化成員
stack->array =
malloc
(sizeof
(void*)
* capacity)
; stack->m_capacity = capacity;
stack->m_size =0;
return stack;
}
入棧的本質就是進行尾插
/*入棧*/
void
push_arraystack
(arrstack pstack,
void
* data)
arraystack* stack = pstack;
//1.若棧已滿,返回
if(stack->m_capacity == stack->m_size)
/*2.入棧:尾插*/
stack->array[stack->m_size]
= data;
stack->m_size++
;}
其本質就是尾刪
void
pop_arraystack
(arrstack pstack)
arraystack* stack = pstack;
//1.若棧已空,返回
if(stack->m_size ==0)
//2.出棧:尾刪
stack->array[stack->m_size-1]
==null
; stack->m_size--
;}
void
*ret_arraystack
(arrstack pstack)
arraystack* stack = pstack;
//1.若棧已空,返回
if(stack->m_size ==0)
return stack->array[stack->m_size-1]
;}
int
empty_arraystack
(arrstack pstack)
arraystack* stack = pstack;
//1.若棧已空,返回
if(stack->m_size ==0)
return0;
}
int
size_arraystack
(arrstack pstack)
arraystack* stack = pstack;
return stack->m_size;
}
void
destory_arraystack
(arrstack pstack)
arraystack* stack = pstack;
if(stack->array !=
null
)free
(pstack)
; pstack =
null
;}
3 順序棧的基本操作
date 2014.12.08 順序棧的基本操作 last in first out lifo 棧內元素遵循 後進先出 lifo 原則 只能在棧的一端進行操作,即在棧頂位置對棧內元素進行操作。剛明白的道理 getchar 對於 鍵盤的所有操作都算在內,敲擊 回車鍵 也算乙個輸入訊號。define m...
3 順序棧的操作(含雙棧共享)
定義 typedef int selemtype typedef struct sqstack 而此處的定義是 top指向棧頂元素在陣列中的位置。top必然小於 stacksize 空棧時 top 1 而且此處的top 不是指標,是陣列的序號。進棧操作 插入元素e為新的棧頂元素 status pus...
資料結構 3 棧的操作
棧 stack 又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元...