数组栈的实现(C语言描述)

简介: 本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。

数组栈的实现

#include <stdio.h>
#include <stdlib.h>
#define MAX 5
/*
    1. 栈容量
    2. 栈顶标记
    3. FILO
*/
typedef struct {
    int* stackMemory;        //栈容量
    int stackTop;            //栈顶标记
    int maxSize;            //栈最大元素个数
}STACK,*LPSTACK;

//创建栈
LPSTACK createStack() {
    LPSTACK stack = (LPSTACK)malloc(sizeof(STACK));
    if (NULL == stack) {
        printf("数组栈内存申请失败!\n");
        return NULL;
    }
    stack->stackMemory = (int*)malloc(sizeof(int) * MAX);
    if (stack->stackMemory == NULL) {
        printf("数组栈数组内存申请失败!\n");
        free(stack);
        stack = NULL;
        return NULL;
    }
    stack->stackTop = -1;
    stack->maxSize = MAX;
    return stack;
}

//内存扩容
void realStack(LPSTACK stack) {
    if (stack == NULL)
        return;
    stack->maxSize += 10;
    int* p = (int*)realloc(stack->stackMemory, stack->maxSize * sizeof(int));
    if (p == NULL) {
        printf("内存扩容失败!\n");
    }
    else {
        stack->stackMemory = p;
    }
}
//入栈
void push(LPSTACK stack, int data) {
    if (stack == NULL) {
        printf("栈不存在,入栈失败!\n");
        return;
    }
    if (stack->stackTop >= stack->maxSize - 1) {
        printf("栈满,已扩容!\n");
        realStack(stack);
    }
    stack->stackMemory[++stack->stackTop] = data;
}

//出栈
void pop(LPSTACK stack) {
    if (stack != NULL && stack->stackTop != -1) {
        stack->stackTop--;
    }
    else {            //栈空
        printf("栈空,无元素可出栈!\n");
        return;
    }
}

//返回栈顶元素
int top(LPSTACK stack) {
    return stack->stackMemory[stack->stackTop];
}
//通过指针方式获取栈顶元素
void getStackTopElement(LPSTACK stack, int* data) {
    *data = stack->stackMemory[stack->stackTop];
}
//万金油函数
int empty(LPSTACK stack) {
    return stack->stackTop == -1;
}
int size(LPSTACK stack) {
    return stack->stackTop + 1;
}
//销毁栈
void destroyStack(LPSTACK* stack) {
    if (*stack != NULL) {
        free((*stack)->stackMemory);
        (*stack)->stackMemory = NULL;
        free(*stack);
        *stack = NULL;
    }
}

int main()
{
    LPSTACK stack = createStack();
    //入栈操作
    for (int i = 0; i < 40; i++)
    {
        push(stack, i);
    }
    printf("size:%d,top: %d\n", size(stack),stack->stackTop);
    //出栈打印操作
    while (!empty(stack)) {
        printf("%d\t", top(stack));
        pop(stack);
    }
    putchar('\n');
    printf("size:%d,top: %d\n", size(stack), stack->stackTop);

    destroyStack(&stack);
    if (stack == NULL) {
        printf("栈销毁成功!\n");
    }

    return 0;
}
相关文章
|
1天前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
1天前
|
C语言
链式栈实现(C语言描述)
这篇文章介绍了如何在C语言中实现链式栈,包括节点和栈的创建、入栈、出栈、获取栈顶元素、判断栈是否为空以及销毁栈的操作。
9 1
|
2天前
|
C语言
链式顺序表实现(C语言描述)
本文介绍了如何在C语言中实现链式顺序表,包括数据结构的定义、节点的创建、数据的插入和删除以及链表的打印和销毁。
12 2
|
2天前
|
C语言
顺序表数组法构建(C语言描述)
如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
10 2
|
2天前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
8 0
|
2天前
|
C语言
C语言数组练习以及场景练习题
C语言数组练习以及场景练习题
16 0
|
2天前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
8 0
|
4天前
|
C语言
C语言数组练习之让生锈大脑转一下(练习篇)
C语言数组练习之让生锈大脑转一下(练习篇)
28 0
|
6天前
|
存储 C语言
初识C语言4——数组
初识C语言4——数组
40 0
|
8天前
|
存储 编译器 C语言
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
【C语言篇】数组和函数的实践:扫雷游戏(附源码)
20 0