ii沙漠

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、栈(Stack):是一种特殊的线性表(数据元素之间的关系是线性关系),其插入、删除只能在表的一端进行,另一端固定不动。

2、术语:

栈顶(top):插入、删除的一端;

栈底(bottom):固定不动的一端;

入栈(push):又称压入,即插入一个元素;

出栈(pop):又称弹出,即删除一个元素;

3、栈的操作

1)栈初始化Inistack(s):将栈置为空;

2)入栈Push(s):即在栈顶插入一个元素;

3)出栈Pop(s):即在栈顶删除一个元素;

4)取栈顶元素Get_top(s):访问栈顶元素;

5)判断栈是否空Empty(s):判断是否为空;

6)求栈的大小Current_size(s):求栈中元素个数;

7)栈清空Clear(s):将栈清为空;

4、栈的ADT描述

ADT Stack{
    data structure:
    D={ai|ai∈D0 i=1,2,... n>=0}
    R={N}
    N={<ai-1,ai>|ai-1,ai∈D0 i=2,3,4,...}
    D0是某个对象
    operations:
    Initiate(S);Push(S);Pop(S);Get_top(S);
    Empty(S);Current_size(S);Clear(S);
}ADT Stack

 

5、存储方式:同一般线性表的顺序存储结构完全相同。但是栈底可以在地址低端,也可以在地址高端。

栈的顺序存储结构的特点:简单,方便,但易产生溢出。

上溢(overflow):栈已经满,又要压入元素;

下溢(Underflow):栈已经空,还要弹出元素;

注:上溢是一种错误,使问题的处理无法进行下去;而下溢一般认为是一种结束条件,即问题处理结束。

6、虑拟实现:

#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct {
    SElemType *base; //在栈构造之前和销毁之后,base=NULL
    SElemType *top;//栈顶指针
    int stacksize;
}SqStack;

 

7、操作

1)栈初始化

Status InitStack(SqStack &S)
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))
    if(!S.base)exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

 

2)入栈    //在栈顶插入新元素,要考虑上溢的处理

Status Push(SqStack &S, SElemType e)
{
    if(S.top-S.base>=S.stacksize)
    {
    S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
    if(!S.base)exit(OVERFLOW)
    S.top=S.base+S.stacksize;
    S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    reutrn OK;
}

 

3)出栈//若栈不空,则删除S的栈顶元素,用e返回其值

Status Pop(SqStack &S, SElemType &e)
{
    if(S.top==S.base) return ERROR;
    e=*--S.top;
    return OK;
}

 

4)判断栈是否空

Status StackEmpty(SqStack S)
{
    if(S.top=S.base)
    return TRUE;
    else return FALSE;
}

 

5)取栈顶元素

Status GetTop(SqStack S, SElemType &e)
{
    //若栈不空,用e返回栈顶元素
    if(S.top==S.base) return ERROR;
    e=*(S.top-1);
    return OK;
}
posted on 2014-04-13 16:24  ii沙漠  阅读(787)  评论(0编辑  收藏  举报