栈的定义:栈(stack)是限定仅在表尾进行插入和删除的线性表
栈的插入操作,也叫入栈、压栈、进栈;
栈的删除操作,也叫出栈、弹栈。
首先我们来看栈的抽象数据类型
ADT 栈(stack)
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
Initstack(*s):初始化操作,建立一个空栈。
DestroyStack(*s):若栈存在,则销毁它。
Clearstack(*s):清空栈。
StackEmpty(s):若栈为空,返回ture,否则返回false。
GetTop(s,*e):若栈s存在且非空,用e返回s的栈顶元素。
Push(*s,e):若栈s存在,插入新元素e到栈s中并成为栈顶元素
Pop(*s,*e):删除栈s中栈顶元素,并用e返回其值。
StackLength(s):返回栈s的元素个数。
endADT
栈的结构定义:
typedef int SElemType;
typedef struct
{
SElemYype data[MAXSIZE];
int top;
}SqStack;
栈的顺序存储结构——进栈操作
//插入元素e为新的栈顶元素
Status Push(SqStack *s,SElemType e)
{
if(S->top == MAXSIZE - 1)
{
return ERROR;
}
S->top++; //栈顶元素加1.
S->data[S->top]=e; //将新插入元素赋值给栈顶空间
return OK;
}
//若栈不空,则删除s的栈顶元素,用e返回其值
Status Pop(SqStack *s,SElemtype *e)
{
if(s->top == -1)
return ERROR;
*e=s->data[s->top]
s->top--;
return OK;
}
//两栈共享空间结构
typedef struct
{
SElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
//插入元素e为新的栈顶元素
Status Pus(SqDoubleStack *s,SElemType e,int stackNumber)
{
if(s->top1+1 == s->top2)
return ERROR;
if(stackNumber == 1)
s->data[++s->top1]=e;
else if(stackNumber == 2)
s->data[--s->top2]=e;
return OK;
}
//若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqDoubleStack *s,SElemType *e,int stackNumber)
{
if(stackNumber == 1)
{
if(s->top1 == -1)
return ERROR;
*e=s->data[s->top1--];
}
else if(stackNumber==2)
{
if(s->top2 == MAXSIZE)
return ERROR;
*e=s->data[s->top2++];
}
return OK;
}
栈的链式存储结构:
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
//插入元素e为新的栈顶元素
Status Push(LinkStack *s,SElemType e)
{
LinkStackPtr d=(LinkStackPtr)malloc(sizeof(StackNode));
d-data=e;
d->next=s->top;
s->top=d;
s->count++;
return OK;
}
//栈的链式存储结构——出栈操作
//操作结果:若栈不空,删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(LinkStack *s,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*s))
return ERROR;
*e=s->top->data;
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
return OK;
}