3 棧的操作

2021-09-29 21:25:41 字數 4577 閱讀 7231

實現方法:

(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 又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元...