栈的顺序存储结构和链式存储结构(转)
栈(stack)很多人都不会太陌生,说到栈大家一定会想到一句话:后进先出(Last In First Out)。这句话就是栈的一个本质特点,其实栈就是一个只能在一端进行插入、删除的特殊的线性表。栈有栈底和栈顶,元素从栈顶出。
下面首先说说栈的顺序存储结构。即用一个StackSize大小的数组来存储整个栈,那么下标为0的元素就是栈底元素,用top变量来指示栈顶元素,因为数组的大小为StackSize,所以0<= top <StackSize。当top=0时表示该栈只有一个元素,top=StackSize-1时表示栈满,top=-1时,表示栈为空栈。
栈的顺序存储结构定义如下:
typedef int SElemType ;
typedef struct
{
SElemType data[MAXSIZE] ;
int top ;
}SqStack ;
顺序存储结构下的进栈操作:
Status Push(SqStack * S , SElemType e)
{
if( S->top == MAXSIZE)
return ERROR ; //满栈
S->top++ ;
S->data[S->top] = e ;
return OK ;
}
顺序存储结构下的出栈操作:
Status Pop(SqStack *S , SElemType e)
{
if(S->top == -1)
return ERROR ; //空栈
e = S->data[S->top] ;
S->top-- ;
return OK ;
}
PS:在栈的顺序存储结构下的进栈和出栈操作的时间复杂度都是O(1)
栈的链式存储结构:
top指针相当于单链表中的头指针。栈的链式存储简称链栈,没有头结点。top=NULL表示栈为空
typedef struct StackNode
{
SElemType data ;
struct StackNode *next ;
}StackNode , *LinkStackPtr ;
typedef struct LinkStack
{
LinkStackPtr top ;
int count ;
}LinkStack ;
链式存储结构下的进栈操作:
Statuc Push(LinkStack *s , SElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)) ;
p->data = e ;
p->next = s->top ;
s->top = p ;
s->count++ ;
return OK ;
}
链式存储结构下的出栈操作:
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;
}
PS:在栈的链式存储结构下的进栈和出栈操作的时间复杂度也是O(1)
最后在说下两个同类型栈共享存储空间:
栈1以数组下标0为栈底,栈2以数组下标为n-1为栈底。top1 = -1表示栈1为空,top2=n表示栈2为空;top1=n-1表示栈1满栈,top2=0表示栈2满栈。当top1+1 = top2时表示两个栈碰面,整个数组满。
两栈共享空间的结构:
typedef struct
{
SElemType data[MAXSIZE] ;
int top1 ;
int top2 ;
}SqDoubleStack ;
两栈共享空间的插入操作:
Status Push(SqDoubleStack *S , SElemType e , int stackNumber) //stackNumber指示第几个栈
{
if(S->top1 + 1 = S->top2)
return ERROR ; //满栈
if(stackNum == 1)
S->data[++S->top1] = e ; //S->top1先加1,再赋值
else if(stackNum == 2)
S->data[--S->top2] = e ; //S->top2先减1,再赋值
return OK ;
}
两栈共享空间的出栈操作:
Statuc Pop(SqDoubleStack *S , SElemType e , int stackNumber)
{
if(stackNumber == 1)
{
if(S->top1 = - 1)
return ERROR ; //栈1为空
*e = S->data[S->top1--] //先赋值再top1减1
}
else if(stackNumber == 2)
{
if(S->top2 = n)
return ERROR ; //栈2为空
*e = S->data[S->top2] ;
S->top2++ ;
}
return OK ;
}
感谢您的阅读,您的支持是我写博客动力。