栈的基本算法

一、简单介绍
栈是限定进在表尾插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊的含义,成为栈顶(top),相应地,表头端称为栈底(bottom)。

不含元素的空表称为空栈。栈的修改是按照后进先出的原则进行的,因此,栈又称为后进先出的线性表。

二、栈示意图

三、基本操作

1、栈的初始化: InitStack(&S)
2、栈顶元素插入: Push(&S, &e)
3、栈顶元素获取: GetTop(&S, &e)
4、栈顶元素删除: Pop(&S, &e)
5、栈的长度: StackLength(S)
6、栈的判空: StackEmpty(S)
7、栈元素的访问: StackTraverse(S, visit())
8、栈的清空: ClearStack(&S)
9、栈的销毁: DestroyStack(&S)

四、栈顺序存储的实现

//---------- 栈的顺序存储表示 ---------
#define STACK_INIT_SIZE 100; //存储空间初始分配量
#define STACKINCREMENT  10;  //存储空间分配增量
typedef struct {
    SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
    SElemType *top;  //栈顶指针
    int stacksize;   //当前已分配的存储空间,以元素为单位 
}SqStack;
//---------- 基本操作的函数原型声明 --------
Status InitStack(SqStack &S);    //构造一个空栈S
Status DestroyStack(SqStack &S); //销毁栈S,S不再存在
Status ClearStack(SqStack &S);   //把S置为空栈
Status StackEmpty(SqStack &S);   //若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(SqStack &S);     //返回S的元素个数,即栈的长度
Status GetTop(SqStack &S, SElemType &e); //若栈S不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
Status Push(SqStack &S, SElemType &e);   //插入元素e为新的栈顶元素
Status Pop(SqStack &S, SElemType &e);    //若栈S不空,则删除S的栈顶元素e,用e返回其值,返回OK,否则返回ERROR
Status StackTraverse(S, visit(SElemType e));        //从栈顶到栈顶依次对每一个元素调用函数visit()。一旦visit()失败,则操作失败
//---------- 基本操作的算法描述 --------
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;
}

Status DestroyStack(SqStack &S){
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
    return OK;
}

Status ClearStack(SqStack &S){
    S.top = S.base;
    return OK;
}

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

int StackLength(SqStack &S){
    return S.top - S.base;
}

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

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;
    return OK;
}

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

Status StackTraverse(S, visit()){
    while(S.top > S.base)
        visit(*S.base++);
    return OK;
}
Status visit(SElemType e)
{
    printf("%d ", e);
    return OK;
}

猜你喜欢

转载自www.cnblogs.com/XYQ-208910/p/11442392.html