栈和队列实质上是俩种受限制的线性表
一 栈的定义:
栈(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");
exit(0);
}
return S->data[S->top];
}