数据结构之栈的顺序存储表示

本文探讨了数据结构中的栈,并重点讲解了如何使用顺序存储来实现栈的功能。通过源代码分析,读者可以深入理解栈的操作原理及其在实际问题中的应用。
摘要由CSDN通过智能技术生成

测试截图:
这里写图片描述
源代码:

//运行环境:VS2015
// 栈的顺序存储表示
//


#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>

//宏定义
#define STACK_INIT_SIZE 5
#define STACKCREMENT 2
#define ERROR 0
#define OK 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

//定义栈的结构体
typedef struct
{
    int *base;
    int *top;
    int stackSize;
}SqStack;

//初始化栈
int initStack(SqStack &S)
{
    //构造一个空战
    S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(STACK_INIT_SIZE));
    if (!S.base)exit(EOVERFLOW);
    S.top = S.base;
    S.stackSize = STACK_INIT_SIZE;
    return OK;
}

//销毁栈
int destroyStack(SqStack &S)
{
    //销毁栈S,S不在存在
    free(S.base);
    S.base = S.top = NULL;
    S.stackSize = 0;
    return OK;
}

//设为空栈
int clearStack(SqStack &S)
{

    if (S.base == S.top)return OK;
    S.top = S.base;
    return OK;
}

//判断是否为空栈
bool isEmpty(SqStack S)
{
    return S.top == S.base;
}



//返回栈顶元素
int getTop(SqStack S, int &e)
{
    if (S.base == S.top)return ERROR;
    e = *(S.top - 1);
    return OK;
}

//返回栈的长度
int stackLength(SqStack S)
{
    return S.top - S.base;
}

//遍历栈
int stackTraverse(SqStack S, int(*visit)(int))
{
    while (S.top>S.base)
    {
        visit(*S.base++);
    }
    return OK;
}

//visit(int)函数
int visit(int e)
{
    printf("%d ", e);
    return OK;
}

//入栈
int push(SqStack &S, int e)
{
    if (S.top - S.base >= S.stackSize)
    {
        //栈满,追加存储空间
        S.base = (int *)realloc(S.base, (S.stackSize + STACKCREMENT) * sizeof(int));
        if (!S.base)exit(OVERFLOW);
        S.top = S.base + S.stackSize;
        S.stackSize += STACKCREMENT;
    }
    *S.top++ = e;
    return OK;
}

//删除栈顶元素
int pop(SqStack &S, int &e)
{
    if (S.base == S.top)return ERROR;
    e = *--S.top;
    return OK;
}

//测试
int main()
{
    SqStack S;
    initStack(S);
    printf_s("请输入...\n");
    while (true)
    {
        int e;
        scanf_s("%d", &e);
        if (e == 1234)break;
        push(S, e);
    }
    printf_s("输出所有元素...\n");
    stackTraverse(S, visit);
    printf_s("\n");
    int e;
    printf_s("删除一个元素后...\n");
    pop(S, e);
    printf_s("删除的元素是:%d\n", e);
    if (isEmpty(S))
    {
        printf("栈现在是空的\n");
    }
    else
    {
        printf_s("栈现在不是空的\n");
    }
    printf_s("输出所有元素...\n");
    stackTraverse(S, visit);
    printf_s("\n");
    getTop(S, e);
    printf_s("现在栈顶元素是:%d\n", e);


    clearStack(S);
    printf_s("清空栈后...\n");
    if (isEmpty(S))
    {
        printf("栈现在是空的\n");
    }
    else
    {
        printf_s("栈现在不是空的\n");
    }
    printf_s("请输入...\n");
    while (true)
    {
        int e;
        scanf_s("%d", &e);
        if (e == 1234)break;
        push(S, e);
    }
    printf_s("输出所有元素...\n");
    stackTraverse(S, visit);
    printf_s("\n");
    destroyStack(S);
    printf_s("释放栈后...\n");
    if (isEmpty(S))
    {
        printf("栈现在是空的\n");
    }
    else
    {
        printf_s("栈现在不是空的\n");
    }
    printf_s("请输入...\n");
    while (true)
    {
        int e;
        scanf_s("%d", &e);
        if (e == 1234)break;
        push(S, e);
    }
    printf_s("序输出...\n");
    int n = stackLength(S);
    for (int i = 1; i <= n; i++)
    {
        int e;
        pop(S, e);
        printf_s("%d ", e);
    }
    printf_s("\n");
    printf_s("现在应该没有元素了...\n");
    if (isEmpty(S))
    {
        printf("栈现在是空的\n");
    }
    else
    {
        printf_s("栈现在不是空的\n");
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值