【数据结构和算法】【栈】顺序栈的代码实现

来源:互联网 发布:最好玩的网络大型游戏 编辑:程序博客网 时间:2024/06/06 05:36

顺序栈的存储方式如下图所示:



代码实现如下:

// Filename: sq_stack.h#ifndef SQ_STACK_H_INCLUDED#define SQ_STACK_H_INCLUDED#ifndef _OK_#define OK  0#endif#ifndef _ERROR_#define ERROR  1#endif#ifndef _TRUE_#define TRUE  1#endif#ifndef _FALSE_#define FALSE  0#endif#ifndef _BiTNode_#define _BiTNode_typedef char TElemType;typedef struct BiTNode{    TElemType data;    struct BiTNode *lchild;    struct BiTNode *rchild;} BiTNode, *BiTree;#endif// 栈中结点的元素类型typedef BiTree SElemType; // TODO: 根据实际应用修改类型typedef struct SqStack{    SElemType *top;     // 栈顶指针    SElemType *base;    // 栈底指针    int stacksize;      // 栈当前可使用的最大容量}SqStack;#define STACK_INIT_SIZE 100     // 顺序栈的存储空间初始分配量#define STACK_INCREMENT 10      // 顺序栈的存储空间分配增量// 栈初始化,即构造一个空栈,成功返回OK,失败返回ERRORint InitStack(SqStack *pS);// 销毁堆栈,成功返回OK,失败返回ERRORint DestroyStack(SqStack *pS);// 判断是否为空栈,是空栈返回TRUE,不是空栈返回FALSEint StackEmpty(SqStack *pS);// 返回栈顶元素,成功返回OK,失败返回ERRORint GetTop(SqStack *pS, SElemType *pE);// 入栈,即插入元素至栈顶,成功返回OK,失败返回ERRORint Push(SqStack *pS, SElemType *pE);// 出栈,即删除元素从栈顶,成功返回OK,失败返回ERRORint Pop(SqStack *pS, SElemType *pE);// 从栈底到栈顶进行遍历,打印栈的元素,成功返回OK,失败返回ERRORint StackTraverse(SqStack *pS, void (*Visit)());#endif // SQ_STACK_H_INCLUDED


// Filename: sq_stack.c#include <stdio.h>#include <stdlib.h>#include "sq_stack.h"// 栈初始化,即构造一个空栈,成功返回OK,失败返回ERRORint InitStack(SqStack *pS){    if (!pS) return ERROR;    pS->base = (SElemType *)malloc(sizeof(SElemType) * STACK_INIT_SIZE);    if (!pS->base) return ERROR;    pS->top = pS->base;    pS->stacksize = STACK_INIT_SIZE;    return OK;}// 销毁堆栈,成功返回OK,失败返回ERRORint DestroyStack(SqStack *pS){    if (!pS) return ERROR;    free(pS->base);    return OK;}// 判断是否为空栈,是空栈返回TRUE,不是空栈返回FALSEint StackEmpty(SqStack *pS){    if (!pS) return TRUE;    if (pS->top == pS->base) return TRUE;    return FALSE;}// 返回栈顶元素,成功返回OK,失败返回ERRORint GetTop(SqStack *pS, SElemType *pE){    if (!pS || !pE) return ERROR;    if (StackEmpty(pS)) return ERROR;    *pE = *(pS->top - 1);    return OK;}// 入栈,即插入元素至栈顶,成功返回OK,失败返回ERRORint Push(SqStack *pS, SElemType *pE){    if (!pS || !pE) return ERROR;    // 栈满则扩充存储空间    if (pS->top - pS->base >= pS->stacksize)    {        pS->base = (SElemType *)realloc(pS->base, pS->stacksize + sizeof(SElemType) * STACK_INCREMENT);        if (!pS->base) exit(1);        pS->top = pS->base + pS->stacksize;        pS->stacksize += STACK_INCREMENT;    }    *pS->top = *pE;    pS->top++;    return OK;}// 出栈,即删除元素从栈顶,成功返回OK,失败返回ERRORint Pop(SqStack *pS, SElemType *pE){    if (!pS || !pE) return ERROR;    // 栈空则返回失败    if (StackEmpty(pS)) return ERROR;    pS->top--;    *pE = *(pS->top);    return OK;}// 从栈底到栈顶进行遍历,对栈的元素调用访问函数Visit(),成功返回OK,失败返回ERRORint StackTraverse(SqStack *pS, void (*Visit)()){    if ((!pS) || (!Visit)) return ERROR;    // 栈空则提示返回    if (StackEmpty(pS)) printf("空栈\n");    SElemType *p = NULL;    for (p = pS->base; p < pS->top; p++)    {        (*Visit)(p);    }    return OK;}



0 0
原创粉丝点击