1.棧的定義
棧是限制僅在表的一端進行插入和刪除運算的線性表又稱爲後進先出表(LIFO表)。插入、刪除端稱爲棧頂,另一端稱棧底。表中無元素稱空棧。
2 棧的邏輯結構和存儲表示
棧的邏輯結構和線性表相同。
棧的抽象數據類型有兩種典型的存儲表示:基於數組的存儲表示和基於鏈表的存儲表示。
(1)基於數組的存儲表示實現的棧稱爲順序棧,順序棧可以採用順序表作爲其存儲表示,因此,可以在順序棧的聲明中用順序表定義它的存儲空間。
(2)基於鏈表的存儲表示實現的棧稱爲鏈式棧,鏈式棧可以採用單鏈表作爲其存儲表示,因此,可以在鏈式棧的聲明中用單鏈表定義它的存儲空間。
3.棧的基本運算有:
1) initstack(s),構造一個空棧;
2) stackempty(s),判棧空;
3) stackfull(s),判棧滿;
4) push(s,x),進棧;
5) pop (s),退棧;
6) stacktop(s),取棧頂元素。
4.順序棧的定義
棧的順序存儲結構稱順序棧。
5.棧的“上溢”和“下溢”
當棧滿時,做進棧運算必定產生空間溢出,稱“上溢”。 當棧空時,做退棧運算必定產生空間溢出,稱“下溢”。上溢是一種錯誤應設法避免,下溢常用作程序控制轉移的條件。
6.在順序棧上的基本運算:
1) 置空棧。
Void initstack(seqstack *s)
{
s->top=-1;
}
2)判棧空。
int stackempty(seqstack *s)
{
return s->top==-1;
}
3)判棧滿。
int stackfull(seqstack *s)
{
return s->top==stacksize-1;
}
4)進棧。
Void push(seqstack *s,datatype x)
{
if(stackfull(s))
error(“stack overflow”);
s->data[++s->top]=x;
}
5)退棧。
Datatype pop(seqstack *s)
{
if(stackempty(s))
error(“stack underflow”);
return S->data[s->top--];
}
6)取棧頂元素。
Dtatatype stacktop(seqstack *s)
{
if(stackempty(s))
error(“stack underflow”);
return S->data[s->top];
}
7.鏈棧的定義
棧的鏈式存儲結構稱鏈棧。棧頂指針是鏈表的頭指針。
8.鏈棧上的基本運算:
1) 建棧。
Void initstack(linkstack *s)
{
s->top=NULL;
}
2)判棧空。
Int stackempty (linkstack *s)
{
return s->top==NULL;
}
3) 進棧。
Void push(linkstack *s,datatype x)
{
stacknode *p=(stacknode *)malloc(sizeof(stacknode));
p->data=x;
p->next=s->top;
s->top=p;
}
4) 退棧。
Datatype pop(linksatck *s)
{
datatype x;
stacknode *p=s->top;
if(stackempty(s))
error(“stack underflow”);
x=p->data;
s->top=p->next;
free(p);
return x;
}
5) 取棧頂元素。
Datatype stacktop(linkstack *s)
{
if(stackempty(s))
error(“stack is empty”);
return s->top->data;
}