分享

栈的顺序存储及运算

 WUCANADA 2012-02-20

栈的顺序存储及运算

1.栈的顺序存储

  栈的顺序存储可用向量来实现,即利用一组地址连续的存储单元依次存放栈中的各个数据元素,又可称为顺序栈。最先 入栈的数据元素为栈底,最后入栈的数据元素为栈顶。一般将向量的低下标位置作为栈底,并保持不变,栈顶位置随着元素的进栈和出栈操作而变化。为了方便操 作,通常设一个标记top标出栈顶元素所在的位置。使用C语言,我们可将顺序栈的数据类型描述如下:

结构3-1 顺序栈

#define Maxsize 100     //假设栈空间最多为100个元素

typedef char Datatype;  //假设栈元素的数据类型为字符

typedef struct

{ Datatype data[Stacksize];

    int top;

  }Seqstack;

  该类型包含两部分内容:一是存放栈中数据元素的data数组,另一个是标记栈顶位置的top。在C语言的描述 中,我们可约定data数组中的data[0]单元不用,并用top=0表示栈空,这也是初始化栈的状态。在实际应用时,需声明一个属于上述类型的栈变 量,即可对此变量进行栈的有关操作。

  现假设有一个栈类型,其最大存储空间Maxsize为6,s为指向该类型的栈指针,按照约定,栈中可存放的数据 元素最多为5个,可存放在s->data[1]至s->data[5]中。初始状态下s->top=0,表示栈空,如图3-2(a)所 示。当栈不满时,可进行进栈操作,当栈不空时,可进行出栈操作。若有数据元素(A,B,C,D,E)依次进栈,则s->top每次加1,并将元素存 入s->top所标记的位置,栈的状态如图3-2(b)、3-2(c)所示。若有数据元素出栈,则删除s->top标记位置的数据元 素,s->top每次减1,如图3-2(d)所示。

32

(a)空栈            (b)A进栈           (c)栈满         (d)E、D出栈

图3-2 顺序栈的状态及进栈、出栈操作

  可见栈空和栈满是进行栈操作的两个限制条件:

  栈空条件:s->top = 0,此时不能进行出栈操作

  栈满条件:s->top = Maxsize -1,此时不能进行进栈操作

2.栈的基本运算的实现

  算法3-1 初始化

  栈的初始化即创建一个空栈。可通过指针变量获取该空栈。算法描述如下: 

void init_seqstack(Seqstack *s)

 { s->top = 0;

 }

  算法3-2 判栈空

  对一个已创建的栈判断其是否为空。若为空,则返回1,否则,返回0,函数的返回值为整型,参数为指向已知栈的指针。算法描述如下:

int empty_seqstack (Seqstack *s)

 { if(s->top == 0)

     return 1;

   else 

return 0;

 }

  算法3-3 判栈满

   对一个已创建的栈判断其是否为满。若为满,则返回1,否则,返回0,函数的返回值为整型,参数为指向已知栈的指针。算法描述如下:

int full_seqstack (Seqstack *s)

 { if(s->top == Maxsize-1)

     return 1;

   else 

return 0;

 }

  算法3-4 进栈

  将一个新的数据元素插入到栈中作为新的栈顶元素。注意插入前首先要判断栈是否已满,若栈满,则不能插入,函数返回0值,表示插入不成功;若不满,移动栈顶标记,插入新的数据元素,函数返回1,表示插入成功。算法描述如下:

int push_seqstack(Seqstack *s, Datatype x)

 { if(full_seqstack(s))            //判栈是否为满

   { printf(″Overflow\n″);

     return 0;}

  else

   { s->top++;

     (s->data)[s->top] = x;

     return 1;}

}

  算法3-5 出栈

  在已知栈中删除栈顶元素并将栈顶元素作为返回值。注意在删除操作之前首先要判断栈是否为为空,若为空,则不能删除;若不为空,则返回栈顶元素,移动栈顶标记。算法描述如下:

Datatype pop_seqstack(Seqstack *s,Datatype *x)

 { if(empty_seqstack(s))         //判栈是否为空

     { printf(″Underflow\n″);     return 0;}

    else

     { &x = (s->data)[s->top];

s->top--;}

    return  x;

   }

  算法3-6 取栈顶元素

  在已知栈中取出栈顶元素并将栈顶元素作为返回值。注意在取出操作之前首先要判断栈是否为为空,若为空,则无元素可取;若不为空,则返回栈顶元素。算法描述如下:

Datatype gettop_seqstack(Seqstack *s)

 { Datatype  x;

   if(empty_seqstack(s))        //判栈是否为空

     {printf(″Stack is empty.\n″);

      x = NULL;}

   else

      x = (s->data)[s->top];

   return x;

}

  算法3-7 置空

  将栈的栈顶标记置为初始状态,成为空栈。算法描述如下: 

void clear_seqstack(Seqstack *s)

 { s->top = 0;

 }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多