定义:作为一种限定性线性表,是将线性表的 插入和删除运算限制为仅在表的一端进行。 表中允许进行插入、删除操作的一端称为 栈顶 (Top),表的另一端被称为栈底 (Bottom)。
当栈中没有元素时称为空栈。 栈的插入操作称为进栈或入栈。 栈的删除操作称为出栈或退栈。
特点:后进先出(LIFO)
栈主要包括两种:
① 顺序栈 用顺序存储结构实现的栈,即利用一组地址 连续的存储单元依次存放自栈底到栈顶的数据元 素,同时由于栈的操作的特殊性,还必须附设一 个位置指针top(栈顶指针)来动态地指示栈顶元 素在顺序栈中的位置。 通常以top = -1表示空栈。
顺序栈的基本操作:
(1)InitStack(S)初始化:初始化一个新的栈。
(2)Empty(S)栈的非空判断:若栈S不空,则返回TRUE;否则,返回 FALSE。
(3)Push(S,x)入栈:在栈S的顶部插入元素x,若栈满,则返回 FALSE;否则,返回TRUE。
(4)Pop(S)出栈:若栈S不空,则返回栈顶元素,并从栈顶中删除该元 素;否则,返回空元素NULL。
(5)GetTop(S)取栈顶元素:若栈S不空,则返回栈顶元素;否则返回 空元素NULL。
(6)SetEmpty(S)置栈空操作:置栈S为空栈。
顺序栈的C语言描述
#define Stack_Size 50
typedef struct
{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
顺序栈的基本操作:
① 初始化
void InitStack(SeqStack *S) { S->top= -1; }
②判栈空
int IsEmpty(SeqStack *S)
{
return(S->top==-1?TRUE:FALSE);
}
③判栈满
int IsFull(SeqStack *S)
{
return(S->top== Stack_Size?TRUE:FALSE);
}
④ 进栈
int Push(SeqStack * S, StackElementType x)
{
if(S->top== Stack_Size)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
⑤出栈
int Pop(SeqStack * S, StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x= S->elem[S->top];
S->top--;
return(TRUE);
}
}