棧:限定僅在表尾進行插入和刪除操作的線性表
棧頂:允許插入和刪除的一端
棧底:不允許插入和刪除的一端
空棧:不含任何資料元素的棧
後進先出的線性表,lifo結構。
進棧:棧的插入
出棧:棧的刪除
元素數量多,出棧的變化會更多。
adt 棧(stack)
> data
> 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。
> operation
>
initstack
(*s)
:初始化操作,建立乙個空棧s;
>
destroystack
(*s)
:若棧存在,則銷毀它
>
clearstack
(*s)
:將棧清空。
>
stackempty
(s):若棧為空,返回true,否則返回false
>
gettop
(s,*e):若棧存在且非空,用e返回s的棧頂元素
>
push
(*s,
*e):若棧s存在,插入新元素e到棧s中並成為棧頂元素
>
pop(
*s,*e)
:刪除棧s中棧頂元素,並用e返回其值。
>
stacklength
(s):返回棧s的元素個數
> endadt
棧是特殊的線性表,後人先出,只能在棧頂(一端)進行插入和刪除
typedef
int selemtype;
/*selemtype型別根據實際情況而定,這裡假設為int*/
typedef
struct
sqstack;
進棧操作push,**實現
/*插入元素e為新的棧頂元素*/
status push
(sqstack *s,selemtype)
s->top++
;//棧頂指標加一
s->data[s->top]
=e;//將新插入元素賦值給棧頂空間
returrn ok;
}
出棧pop,**實現:
status pop
(sqstack *s,selemtype)
*e=s->data[s->top]
;//把要刪除的棧頂元素賦值**移)給*e
s->top--
;//棧頂指標減一
return ok;
}
兩個同型別的棧,如果分開儲存可能會有乙個已經滿了,而另乙個空間被浪費了,所以可以兩棧共享空間,從兩棧兩端向中間儲存。
需要標識是哪個棧,stacknumber
棧滿標識:兩個棧頂之間差一:top1+1=top2.
/*兩棧共享空間結構*/
typedef
struct
sqdoublestack
/*插入元素e為新的棧頂元素*/
status push
(sqdoublestack *s,
int stacknumber)
/*若棧不空,則刪除s的棧頂元素,用e返回其值,並返回?;否則返回error*/
status pop
(sqdoublestack *s,
int stacknumber)
else
if(stacknumber==2)
return ok;
}
兩個棧有相反需求關係時,兩棧共享空間有作用。 棧與佇列 建立棧 佇列
陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...
棧與佇列1 設計getMin功能的棧
設計棧,實現基本功能的前提下,實現返回棧內最小元素的功能 1.push,pop,getmin 複雜度為o 1 2.允許使用現成棧結構 使用兩個棧,stackdata和stackmin,stackmin負責存最小值 共同點 都用stackmin儲存stackdata的最小值,時間複雜度均為o 1 空間...
棧與佇列 課後練習1
判斷棧輸出順序正確與否 問題描述 給定乙個棧,其中最多儲存m個資料。將n個資料以1,2,3,n的順序壓棧,然後再隨機彈棧。判斷一下哪些是有可能的彈棧順序,而哪些不是。例如m是5,n是7,我們可以得到1,2,3,4,5,6,7的彈棧順序,而不能得到3,2,1,7,5,6,4這樣的彈棧順序。m,n 10...