栈的顺序存储结构

1 定义
  栈是限定只能在表尾删除和插入操作的线性表。
  允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
  栈的插入操作称为进栈,也称压栈、入栈。
  栈的删除操作称为出栈,也称弹栈。

2 栈的抽象数据结构
  由于栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化。将进栈和出栈分别改名为push和pop。
  由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈。

3 栈的顺序存储结构
  用顺序存储结构存储的栈称为顺序栈。线性表是用数组来实现的。对于栈,用下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化比较小。
  我们定义一个top变量来指示栈定元素在数组中的位置。若存储栈的长度为StackSize,则栈顶位置top必需小于StackSize。当栈存在一个元素时,top等于0,因此空栈的判断条件为top等于-1.

  栈的结构定义

    typedef int SElemType;
    typedef struct {
        SElemType data[MAXSIZE];
        int top;                //用于栈顶指针
    } SqStack;

若现在有一个栈,StackSize为5,则普通栈、空栈、满栈的情况如下图所示。


4 进栈
对于栈的插入,即进栈操作,其实就是做了如下处理。

Status Push(SqStack *s, SElemType e) {

    if (s->top == MAXSIZE - 1) {        //栈满
        return ERROR;
    }

    s->top ++;    //栈顶指针加1
    s->data[s->top] = e;    //将新元素赋值给栈顶空间
    
    return OK;
}    

5 出栈

Status Pop(SqStack *s, SElemType *e) {

        if (s->top == -1) {                //空栈
            return ERROR;
        }

        *e = s->data[s->top];            //将要删除的栈顶元素赋值给e
        s->top --;                        //栈顶指针减1

        return OK;
   }

 

posted @ 2016-07-06 14:54  紫洁  阅读(13123)  评论(0编辑  收藏  举报