数据结构:栈的原理与 C 语言实现
一、栈是什么?
栈(Stack)是一种特殊的线性表,其核心特性在于只允许在固定的一端进行插入和删除操作。这一端被称为栈顶,另一端则称为栈底。栈中的数据元素遵循后进先出(LIFO, Last In First Out)的原则。
注意:这里讨论的是数据结构中的栈,而非操作系统中的调用栈。二者虽然同名,但应用场景和原理有所不同,请勿混淆。
1. 后进先出(LIFO)
所谓后进先出,直观理解就是最后放入的数据最先被取出。这就好比枪上的弹夹:先压进去的子弹后打出去,后压进去的子弹先打出去。
2. 压栈与出栈
- 压栈(Push):即入栈操作,数据从栈顶插入。
- 出栈(Pop):即删除操作,数据从栈顶移除。
无论是插入还是删除,操作都集中在栈顶进行。
二、栈的实现思路
1. 存储结构选择
栈可以使用数组或链表实现。相对而言,使用动态数组(顺序表)来实现栈通常更优。虽然顺序表在中间位置插入删除效率较低,但栈的特性决定了我们只在尾部(栈顶)进行操作,避免了中间移动数据的开销,因此数组是更合适的选择。
2. 核心成员定义
参考顺序表的实现,栈的结构体通常包含三个关键成员:
- 指向底层数组的指针。
- 当前栈内有效元素的个数(size)。
- 当前分配的总容量(capacity)。
3. 关键注意事项
实现栈时,必须严格遵守只允许在固定一端操作的原则。不能在两端同时随意操作,否则就失去了栈的意义。因此,我们在代码中应确保所有增删改查逻辑都围绕栈顶索引展开。
三、代码实现细节
本文以 int 类型的栈为例,展示完整的 C 语言实现过程。为了便于类型扩展,我们使用宏定义或 typedef 来抽象数据类型。
1. 头文件声明 (Stack.h)
头文件负责存放函数声明、必要的库函数引入以及类型定义。良好的工程习惯是将接口与实现分离。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
// 重定义数据类型,方便后续修改
typedef int STDataType;
// 栈结构体定义
STDataType* a;
size;
capacity;
} Stack;
;
;
;
;
STDataType ;
;
;


