栈(Stack)是一种后进先出的数据结构,传统的数组实现栈虽然简单,但有固定大小的限制。而单链表实现栈则无需预先分配固定空间,实现按需分配,无空间浪费,所有操作都在链表头部完成,时间复杂度为O(1),本文将详细解析如何使用C语言通过单链表实现一个完整的栈结构。

栈只需要一个指针——栈顶指针top。
一、数据结构定义
#include <stdio.h>
#include <stdlib.h>
// 定义节点
typedef struct Node {
int data; // 数据域:存储栈元素
struct Node *next; // 指针域:指向下一个节点
} Node, *Link; //取别名
二、关键操作详细
1. 初始化栈(initStack)
- 返回
NULL表示空栈; - 栈顶指针为空时,栈中没有任何元素。
// 初始化栈
Link initStack() {
return NULL;
}
2. 判断栈空(isEmpty)
- 如果
top == NULL,返回1(真),表示栈空; - 否则返回0(假),表示栈非空。
// 判断栈空
int isEmpty(Link top) {
return top == NULL;
}
3. 入栈操作(push)
创建新节点—>设置结点数据——>新节点指向原栈顶
// 入栈
Link push(Link top, int value) {
// 1. 创建新节点
Link newNode = (Link)malloc(sizeof(Node)); //动态分配节点内存
// 2. 设置节点数据
newNode->data = value;
// 3. 新节点指向原栈顶
newNode->next = top;
// 4. 返回新栈顶
return newNode;
}
4. 出栈操作(pop)
- 必须使用
temp临时保存原栈顶节点; free(temp)释放内存,防止内存泄漏;- 每个
malloc必须对应一个free。
Link pop(Link top, int *value) {
// 1. 检查栈是否为空
if (isEmpty(top)) {
printf("栈空\n");
*value = -1; // 设置错误返回值
return top;
}
// 2. 保存当前栈顶节点(用于释放内存)
Link temp = top;
// 3. 获取栈顶数据
*value = top->data;
// 4. 栈顶指针下移
top = top->next;
// 5. 释放原栈顶节点内存
free(temp);
// 6. 返回新栈顶
return top;
}
5. 获取栈顶元素(topValue)
// 获取栈顶
int topValue(Link top) {
if (isEmpty(top)) {
printf("栈空\n");
return -1;
}
return top->data;
}
6. 打印栈元素(printStack)
void printStack(Link top) {
Link p = top; // 临时指针用于遍历
while (p != NULL) { // 遍历直到链表末尾
printf("%d ", p->data);
p = p->next; // 移动到下一个节点
}
printf("\n");
}
7. 释放栈内存(freeStack)
Link freeStack(Link top) {
Link p;
while (top != NULL) {
p = top; // 保存当前节点
top = top->next; // 移动到下一个节点
free(p); // 释放当前节点
}
return NULL; // 返回空指针
}
8. 主函数main
int main() {
// 1. 创建空栈
Link stack = NULL;
// 2. 连续入栈测试
stack = push(stack, 1); // 栈:1
stack = push(stack, 2); // 栈:2 → 1
stack = push(stack, 3); // 栈:3 → 2 → 1
// 3. 打印栈内容
printf("栈内容: ");
printStack(stack); // 输出:3 2 1
// 4. 出栈测试
int val;
stack = pop(stack, &val); // 弹出3
printf("出栈: %d\n", val); // 输出:出栈: 3
// 5. 查看当前栈顶
printf("栈顶: %d\n", topValue(stack)); // 输出:栈顶: 2
// 6. 清理栈内存
stack = freeStack(stack);
return 0;
}
三、运行结果

1251

被折叠的 条评论
为什么被折叠?



