棧(stack)在計算機科學中是限定僅在表尾進行插入或刪除操作的線形表。
棧是壹種數據結構,是只能在某壹端插入和刪除的特殊線性表。它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後壹個數據被第壹個讀出來)。
棧是允許在同壹端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的壹端稱為棧頂(top),另壹端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入壹般稱為進棧(PUSH),刪除則稱為退棧(POP)。 棧也稱為後進先出表(LIFO表)。
棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧!
棧的模型二、基本算法
1、進棧(PUSH)算法
①若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);
②置TOP=TOP+1(棧指針加1,指向進棧地址);
③S(TOP)=X,結束(X為新進棧的元素);
2、退棧(POP)算法
①若TOP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②);
②X=S(TOP),(退棧後的元素賦給X);
③TOP=TOP-1,結束(棧指針減1,指向棧頂)。
三、棧的實現
在pascal下的實現
1、數組型
Const
m=棧表目數的上限;
Type
stack=array[1..m] of stype; {棧類型}
Var
s:stack;{棧}
top:integer; {棧頂指針}
2、記錄型
const
m=棧表目數的上限;
type
stack=record
elem: array[1..m] of elemtp;
top:0..m; {棧頂指針}
end;
Var
s:stack;{棧}
在C/C++中棧的壹些基本操作:
C代碼:
/*
@**2009/09/24
棧的基本操作
*/
#include <iostream>
#define MaxSize 100
using namespace std;
typedef struct
{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack *st) //初始化棧
{
st->top=-1;
}
int StackEmpty(SqStack *st) //判斷棧為空
{
return (st->top==-1);
}
void Push(SqStack *st,int x) //元素進棧
{
if(st->top==MaxSize-1)
printf("棧上溢出!\n");
else
{
st->top++;
st->data[st->top]=x;
}
}
void Pop(SqStack *st) //退棧
{
if(st->top==-1)
printf("棧下溢出\n");
else
st->top--;
}
int Gettop(SqStack *st) //獲得棧頂元素
{
if(st->top==-1)
{
printf("棧空\n");
return 0;
}
else
return st->data[st->top];
}
void Display(SqStack *st) //打印棧裏元素
{
int i;
printf("棧中元素:");
for(i=st->top;i>=0;--i)
printf("%d ",st->data[i]);
printf("\n");
}
int main()
{
SqStack L;
SqStack *st=&L;
InitStack(st);
printf("棧空:%d\n",StackEmpty(st));
for(int i=1;i<10;++i)
Push(st,i);
Display(st);
printf("退壹次棧\n");
Pop(st);
printf("棧頂元素:%d\n",Gettop(st));
Pop(st);
Display(st);
return 0;
}