栈的顺序存储结构和链式存储结构(转)

栈(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 ;

}

posted @ 2017-02-16 15:11  N神3  阅读(1757)  评论(0编辑  收藏  举报