3 栈和队列-栈的定义(待更改)

来源:互联网 发布:淘宝hd无法登陆 编辑:程序博客网 时间:2024/06/05 00:48
//An是栈顶,A1端是栈底//基本操作InitStack(&S)//操作结果:构造一个空栈S。DestroyStack(&S)//初始条件:栈S已经存在//操作结果:栈S被销毁ClearStack(&S)//初始条件:栈S已经存在//操作结果:栈S清空为出栈StackEmpty(S)//初始条件:栈S已经存在//操作结果:若栈S为空栈,则返回TRUE,否则返回FALSEStackLength(S)//初始条件:栈S已经存在//操作结果:返回S的元素的个数,即栈的长度GetTop(S,&e);//初始条件:栈S已存在//操作结果:用e返回栈顶元素。Push(&S,e)//初始条件:栈S已存在//操作结果:插入元素e为新的栈顶元素Pop(&S,&e)//初始条件:栈S已存在//操作结果:删除S的栈顶元素,同时并用e返回其值StackTraverse(S,visit())//初始条件:栈S已存在且非空//操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()//一旦调用的失败,则操作失败

和线性表类似,栈的存储方法,分为两种
(1)顺序栈:栈的顺序存储结构是利用一组地址连续的存储单元依次
存放自栈底到栈顶的数据元素,
同时附设指针top指示栈顶元素在顺序栈中的位置。
【习惯做法】top=0表示空栈,一般在初始化设空栈时不应限定栈的最大容量
【合理做法】先为栈分配一个基本容量,当栈的空间不够时在逐渐扩大
设定两个常量:1_STACK_INIT_SIZE(存储空间初始分配量)
2_STACKINCREMENT(存储空间分配增量)

//顺序栈的定义typedef struct{    SElemType *base;    SElemType *top;    int stacksize; //当前可使用的最大容量}SqStack;

栈的初始化操作为:按设定的初始分配量进行第一次存储分配
base为栈底指针,在顺序栈中,他始终指向栈底的位置,
若base的值为NULL,则表明栈结构不存在
top为栈顶指针,其初值指向栈底,若top=base,则栈空。
每当插入新的栈顶元素时,指针top增1。
删除栈顶元素时,指针top减1
非空栈的栈顶指针始终在栈顶元素的下一个位置上

//----------ADT Stack的表示与实现---------//----------栈的顺序存储表示--------------#define STACK_INIT_SIZE 100;//存储空间初始分配量#define STACKINCREMENT 100;//存储空间初始分配量typedef struct{    SElemType *base;//构造之前和销毁之后,base的值为NULL    SElemType *top; //栈顶指针 base和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,否则返回FALSEint StackLength(SqStack);//返回S的元素的个数,即栈的长度Status GetTop(SqStack S,SElemType &e); //若栈不空,则用e返回S栈顶元素,并返回OK 否则返回FALSEStatus Push(SqStack &S,SElemType e);//操作结果:插入元素e为新的栈顶元素Status Pop(SqStack &S,SElemType &e);//操作结果:删除S的栈顶元素,同时并用e返回其值StackTraverse(SqStack S,Status(*visit)())//操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()//一旦调用的失败,则操作失败
//---------基本操作和算法描述-------------Status InitStack(SqStack &S) //构造一个空栈S。{    //构造一个空栈S。    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));    if(!Sbase)exit(OVERFLPW);//存储分配失败    S.top = S.base;    S.stacksize = STACKINCREMENT;    return OK;}//InitStackStatus GetTop(SqStack S,SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR{    if(S.top==S.base) return ERROR;    e = *(S.top-1);    return OK;}//GetTopStatus Push(SqStack &S,SElemType e)    //插入元素e为新的栈顶元素{    if(S.top-S.base>=S.stacksize)//栈满追加空间    {        S.base = (SElemType*)relloc(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){    //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR    if(S.top==S.base) return ERROR;    e = *--S.top;    return OK;}
原创粉丝点击