栈的基本操作

栈的9项基本操作。

#include
#include

#define STACK_INIT_SIZE 10 //存储空间初始化分配量
#define STACKINCREMENT 2//存储空间分配量
typedef int SElemType;
typedef struct SqStack
{
    SElemType *base;//栈顶指针
    SElemType *top;//栈底指针
    int stacksize;//当前已经分配的存储空间
}SqStack;


void InitStack(SqStack &S)
{//初始化栈,构造一个空栈
    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if (S.base == NULL)
    {
        printf("内存分配失败!!!\n");
        exit(0);
    }
    S.top = S.base;//栈顶指针指向栈底
    S.stacksize = STACK_INIT_SIZE;//栈的初始化内存
}

void DestroyStack(SqStack &S)
{//销毁栈
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
}

void ClearStack(SqStack &S)
{//将S置为空栈
    S.top = S.base;//是栈顶指针指向栈底
}

bool StackEmpty(SqStack S)
{//判断一个栈是否为空
    if(S.base == S.top)
        return true;
    else
        return false;
}

int StackLength(SqStack S)
{//返回栈的元素个数
    return S.top-S.base;
}

void GetTop(SqStack S,SElemType &e)
{//若栈已存在且非空,用e返回它的栈顶元素
    if(StackEmpty(S))
    {
        printf("栈为空!!!\n");
        exit(0);
    }
    else
    {
        e = *(--S.top);//先把栈顶指针移到栈顶元素处,然后取出栈顶元素
    }

}

void Push(SqStack &S,SElemType e)
{//栈S已存在,插入元素e为新的栈顶元素
    if(S.base != NULL)
    {
        if(S.top-S.base == S.stacksize)
        {
            S.base = (SElemType*)realloc(S.base, (STACKINCREMENT+STACK_INIT_SIZE)*sizeof(SElemType));
            if(S.base == NULL)
            {
                printf("内存重新分配失败!!!\n");
                exit(0);
            }
            S.top = S.base + S.stacksize;
            S.stacksize = S.stacksize+STACKINCREMENT;
        }
        *(S.top++) = e;//先把e放在栈顶,然后栈顶指针上移
    }
    else
    {
        printf("栈不存在!!!\n");
        exit(0);
    }
}

void Pop(SqStack &S, SElemType &e)
{//栈已存在且非空.删除S的栈顶元素,并用e返回其值.
    if(S.base != NULL)
    {
        if(StackEmpty(S))
        {
            printf("栈为空!!!\n");
            exit(0);
        }
        else
        {
            e = *(--S.top);//先把栈顶指针下移到栈顶元素,然后取出栈顶元素的值赋给e.
        }

    }
    else
    {
        printf("栈不存在!!!\n");
        exit(0);
    }
}

void StackTraverse(SqStack S)
{//从栈底到栈顶依次对S的每个数据元素进行遍历

你可能感兴趣的:(数据结构学习笔记)