栈的数组实现

简介: 栈的数组实现

首先,栈是一个表,栈限制了插入和删除操作只能在一个位置上进行,这个位置是表的末端,所以栈是一种先进后出的数据结构

栈的实现非常简单,尤其是使用链表,只需要维护一个栈顶指针,入栈时将指针移到新加入的节点,出栈时将指针移到下一个节点

本文介绍栈的数组实现

实现思路:

1.维护一个栈顶索引

2.入栈时将索引 + 1

3.出栈时将索引 - 1

4.入栈和出栈前判断栈是否为满和空

代码实现

1.定义栈结构体:

typedef struct {
    int *data; // 栈的实际内存空间,是一个数组
    int top;   //栈顶索引
    int capacity; // 栈空间的大小
} stack;

2.初始化栈

void init_stack(stack *stack) {
    stack->data = (int *)malloc(INITIAL_CAPACITY * sizeof(int)); // 分配空间
    stack->top = -1; // 栈顶初始索引为-1
    stack->capacity = INITIAL_CAPACITY; // 默认大小
}

3.动态扩容

void expand(stack* stack) {
    stack->capacity *= 2;
    // 增长栈空间,为原来的2倍
    stack->data = (int *)relloc(stack->data, stack->capacity * sizeof(int));
}

4.入栈

void push(stack *stack, int value) {
    if (stack->top == stack->capacity - 1) { // 空间是否足够 
        expand(stack); // 不够则扩容
    }
    stack->data[++stack->top] = value; // 入栈
}

5.出栈

int pop(stack *stack) {
    if (is_empty(stack)) {
        printf ("stack is empty now!\n");
        exit(EXIT_FAILURE);
    }
    return stack->data[stack->top--];
}

6.销毁栈

void free_stack(stack *stack) {
    free(stack->data);
    stack->data = NULL;
    stack->top = -1;
    stack->capacity = 0;
}

7.测试

int main() {
    stack stack;
    init_stack(&stack);
    push(&stack, 10);
    push(&stack, 11);
    push(&stack, 12);
    push(&stack, 13);
     printf("Top element is %d\n", peek(&stack));
    printf("Popped element is %d\n", pop(&stack));
    printf("Top element is now %d\n", peek(&stack));
    free_stack(&stack);
    return 0;
}

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

目录
相关文章
|
1天前
|
存储
|
16天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
18天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
119 3
|
20天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
23 0
【数据结构】栈和队列的深度探索,从实现到应用详解
|
1天前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
24天前
|
Linux C++ Windows
栈对象返回的问题 RVO / NRVO
具名返回值优化((Name)Return Value Optimization,(N)RVO)是一种优化机制,在函数返回对象时,通过减少临时对象的构造、复制构造及析构调用次数来降低开销。在C++中,通过直接在返回位置构造对象并利用隐藏参数传递地址,可避免不必要的复制操作。然而,Windows和Linux上的RVO与NRVO实现有所不同,且接收栈对象的方式也会影响优化效果。
|
1月前
|
存储 安全 编译器
缓冲区溢出之栈溢出(Stack Overflow
【8月更文挑战第18天】
64 3
|
26天前
crash —— 获取内核地址布局、页大小、以及栈布局
crash —— 获取内核地址布局、页大小、以及栈布局
|
26天前
|
存储 程序员 C语言
堆和栈之间有什么区别
【9月更文挑战第1天】堆和栈之间有什么区别
98 0
|
1月前
|
机器学习/深度学习 消息中间件 缓存
栈与队列的实现
栈与队列的实现
38 0