棧和隊列實質上是倆種受限制的線性表
一 棧的定義:
棧(stack)是限制僅在表的一端進行插入和删除運算的線性表。
(1)通常稱插入、删除的這一端為棧頂(top),另一端稱為棧底(bottom)。
(2)當表中沒有元素時稱為空棧。
(3)棧為後進先出(last in first out)的線性表,簡稱為lifo表。
棧的修改是按後進先出的原則進行。每次删除(退棧)的總是目前棧中"最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,要到最後才能删除。
二 棧的順序存儲結構
實質上是運算受限的線性表
(1)順序棧的類型定義
#define stacksize 100//假定預先配置設定100元素
typedef char datatype;//假定棧元素的資料類型為字元
typedef struct
{
datatype data[stacksize];
int top;
}seqstack;
注:top用來訓示目前棧頂的位置,因為在棧低是不變的
三 順序棧的基本操作
規定: s是seqstack類型指針,s->data[0]為棧底元素
(1)進棧操作
進棧時,需要将s->top加1
①s->top==stacksize-1表示棧滿
②"上溢"現象--當棧滿時,再做進棧運算産生空間溢出的現象。
(2)出棧操作
退棧時,需将s->top減1
①s->top<0表示空棧
②"下溢"現象——當棧空時,做退棧運算産生的溢出現象。
置棧空
void initstack(seqstack *s)
{//将順序棧置空
s->top=-1;
}
判棧空
int stackempty(seqstack *s)
{
return s->top==-1;
}
判棧滿
int stackfull(seqstack *s)
{
return s->top==stacksize-1;
}
進棧
void push(seqstack *s,int x)
if (stackfull(s))
printf("stack overflow"); //上溢,退出運作
s->data[++s->top]=x;//棧頂指針加1後将x入棧
退棧
datatype pop(seqstack *s)
if(stackempty(s))
{
printf("stack underflow"); //下溢,退出運作
exit(0);
}
return s->data[s->top--];//棧頂元素傳回後将棧頂指針減1
取棧頂元素
datatype stacktop(seqstack *s)
if(stackempty(s))
{
printf("stack is empty");
}
return s->data[s->top];
轉載:http://blog.csdn.net/xsf50717/article/details/39934051