栈的运算和基本概念
栈(stack)是一种只允许在一段进行插入和删除的线性表,它是一种操作受限的线性表。表中只允许插入和删除的一端称为顶端(top),另一端称为底端(buttom)。栈的插入操作通常称为进栈入栈(push),栈的删除操作为出栈或者退栈(Pop)。当栈中无元素时称为空栈。
栈的顺序存储结构
1、栈的顺序存储结构
利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组中的任意一个端点,栈顶是随着插入和删除的变化而变化的,用一个int top来作为前栈顶的位置:
#define MAXSIZE <栈最大元素数>
typedef sturcut{
datatype data[MAXSIZE];
int top;
}SeqStack;
定义一个指向顺序栈的指针:
SeqStack *s;
通常0下端设为栈底,这样空栈事的指针top=-1;入栈时,栈顶指针+1,即s->top++;出栈时,栈顶减一,即s->top--。
栈的基本操作的实现如下:
(1)、置空栈:首先建立栈控间,然后初始化栈顶.
SeqStack *Init(){
SeqStak *s;
s = (SeqStack *)malloc(sizeof(SeqStack));
s->top = -1;
return s;
}
(2)、判空栈
int Empty(SeqStack *s){
if(s->top == -1)
return 1 ;
else
return 0;
}
(3)、入栈
int Push(SeqStack *s,datatype x){
if(s->top ==MAXSIZE-1)
return 0;
else{
s->top++;
s->data[s->top]=x;
return 1;
}
}
(4)、出栈
int Pop(SeqStack *s,datatype *x){
if(Empty(s))
return 0;
else{
*x=s->data[s->top];
s->top--;
return 1;
}
}
(5)、取栈顶元素
datatype Top(SeaStack *s){
if(Empty(s))
return 0;
else
return (s->data[s->top]);
}
注意一下几点:
1.对于顺序栈,入栈时,首先判栈是否满了,满栈的条件是:s->top == MAXSIZE,栈满时不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。
2.出栈和取栈顶元素时应该判断栈是否为空,为空时不能操作,否则产生错误。
3.取栈顶元素与出栈的不同在于,top位置改不改变。
2、多栈共享邻接空间
两栈共享的数据结构可以定义为:
typedef struct{
Elemtype stack[MAXNUM];
int lefttop;
int righttop;
}dupsqstack;
左栈入栈时,栈顶指针加1,右栈入栈时,栈顶指针减1,。由于两个栈顶均可向中间伸展,互补余缺,因此每个栈的最大空间均大于m/2。为了识别左右栈,必须另外设定标志;
char status;
status = 'L';
status = 'R';
在进行操作时,需要制定栈号,status = 'L'为左栈,status = 'R'为右栈;判断栈满的条件为:s->lefttop+1==s->righttop;
共享栈的基本操作如下:
(1)、初始化操作
int initDupStack(dupsqStack *s){
if((s = (dupsqStack *)malloc(sizeof(dupsqStack)))==NULL)
return false;
s->lefttop = -1;
s->righttop = MAXNUM;
return true;
}
(2)、入栈操作
int pushDupStack(dupsqStack *s,char status,Elemtypt x){
if(s->lefttop +1 == s->righttop)
return false;
if(status == 'L'){
s->stack[++s->lefttop] = x;
}
else(status == 'R')
s->stack[--s->lefttop] = x;
else
return false;
return true;
}
(3)、出栈操作
Elemtype popDupStack(dupsqstack *s,char status){
if(status == 'L'){
if(s->lefttop<0)
return NULL;
else
return (s->stack[s->lefttop--]);
}
else if(status=='R'){
if(s->righttop > MAXNUM-1)
return NULL;
else
return (s->stack[righttop++]);
}
else
return NULL;
}
3、栈的链式存储结构
栈的链式存储结构可参考链表 和 上面的栈的基本操作。