数据结构->栈ATD

来源:互联网 发布:天津河东淘宝街搬哪了 编辑:程序博客网 时间:2024/04/30 12:31
#include<stdio.h>#include<malloc.h>#include<stdlib.h>//----------------------------------------------------常定义//#define TRUE  1#define FALSE 0#define OK    1#define ERROR 0#define OVERFLOW        -2#define INFEASIBLE      -1#define STACK_INIT_SIZE 100;//存储空间初始分配量#define STACKINCREMENT  10;//存储空间分配量增量typedef int Status;
//----------------------------------------------顺序栈的定义//typedef char SElemType;//以char型数组模拟typedef struct{    SElemType *base;    SElemType *top;    int stacksize;}SqStack;
//-------------------------------------------------基本操作//Status InitStack(SqStack *S);//构造一个空栈SStatus DestroyStack(SqStack *S);//销毁栈S,S不再存在Status ClearStack(SqStack *S);//把S置为空栈Status StackEmpty(SqStack S);//若栈S为空栈,则返回TRUE,否则返回FALSEint    StackLength(SqStack S);//返回S的元素个数,即栈的长度Status GetTop(SqStack S,SElemType *e);//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORStatus Push(SqStack *S,SElemType e);//插入元素e为新的栈顶元素Status Pop(SqStack *S,SElemType *e);//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORStatus StackTraverse(SqStack S,Status (*visit)(SElemType));//从栈底到栈顶依次对栈中的每个元素调用visit().一旦visit()失败,则操作失败
//-----------------------------------------------基本操作的算法描述//Status InitStack(SqStack *S){//构造一个空栈S    S->base=(SElemType *)malloc(100 * sizeof(SElemType));//100实为STACK_INIT_SIZE    if(!S->base) exit(OVERFLOW);    S->top =S->base;    S->stacksize=STACK_INIT_SIZE;    return OK;}//InitStack
Status GetTop(SqStack S,SElemType *e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR    if(S.top ==S.base) return ERROR;    *e = *(S.top -1);    return OK;}//GetTop
Status Push(SqStack *S,SElemType e){//插入元素e为新的栈顶元素    if(S->top - S->base >= S->stacksize){//栈满,追加存储空间        S->base =(SElemType *)realloc(S->base,            (S->stacksize + 10 ) * sizeof(SElemType));//10实为STACKINCREMENT        if(!S->base) exit(OVERFLOW);//分配内存失败        S->top = S->stacksize +S->base ;        S->stacksize += STACKINCREMENT;    }    *S->top++ = e;    return OK;}//Push
Status Pop(SqStack *S,SElemType *e){    //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR    if(S->top == S->base)  return ERROR;    *e = * --S->top ;    return OK;}//Pop
Status DestroyStack(SqStack *S){//销毁栈S,S不再存在    S->stacksize =0;    free(S->base);    S->base = S->top = NULL;    return OK;}//DestroyStack
Status ClearStack(SqStack *S){//把S置为空栈    S->top = S->base;    return OK;}//ClearStack
Status StackEmpty(SqStack S){//若栈S为空栈,则返回TRUE,否则返回FALSE    return S.top == S.base? TRUE:FALSE;}
int    StackLength(SqStack S){//返回S的元素个数,即栈的长度    return (S.top-S.base)/sizeof(SElemType);}//StackLength
Status StackTraverse(SqStack S,Status (*visit)(SElemType)){//从栈底到栈顶依次对栈中的每个元素调用visit().一旦visit()失败,则操作失败    SElemType *p;    for(p=S.base;p!=S.top;++p)        if(!visit(*p)) return ERROR;    return OK;}//StackTraverse
//--------------------------------------------------调试函数//Status tral(SElemType e){//遍历输出printf("%c ",e);return OK;}
0 0
原创粉丝点击