您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用C语言实现链式栈
## 1. 链式栈概述
链式栈(Linked Stack)是采用链式存储结构实现的栈。与顺序栈不同,链式栈不需要预先分配固定大小的存储空间,而是通过动态内存分配来存储元素,理论上只要内存足够就可以无限扩展。
### 1.1 链式栈的特点
- 动态内存分配,无需预先确定栈大小
- 插入和删除操作都在表头进行,时间复杂度为O(1)
- 不会出现栈满的情况(除非内存耗尽)
- 每个节点需要额外空间存储指针,空间利用率略低于顺序栈
### 1.2 链式栈的基本操作
- 初始化(init)
- 入栈(push)
- 出栈(pop)
- 获取栈顶元素(top)
- 判断栈空(isEmpty)
- 销毁栈(destroy)
## 2. 链式栈的数据结构设计
### 2.1 节点结构定义
```c
typedef struct StackNode {
int data; // 存储数据(这里以int为例)
struct StackNode *next; // 指向下一个节点的指针
} StackNode;
typedef struct LinkedStack {
StackNode *top; // 栈顶指针
int size; // 栈中元素个数(可选)
} LinkedStack;
void initStack(LinkedStack *stack) {
stack->top = NULL; // 栈顶指针初始化为NULL
stack->size = 0; // 元素个数初始化为0
}
int isEmpty(LinkedStack *stack) {
return stack->top == NULL; // 或者 return stack->size == 0;
}
int push(LinkedStack *stack, int value) {
// 创建新节点
StackNode *newNode = (StackNode*)malloc(sizeof(StackNode));
if (newNode == NULL) {
printf("Memory allocation failed!\n");
return 0; // 入栈失败
}
newNode->data = value;
newNode->next = stack->top; // 新节点指向原栈顶
stack->top = newNode; // 更新栈顶指针
stack->size++; // 栈大小增加
return 1; // 入栈成功
}
int pop(LinkedStack *stack, int *value) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
return 0; // 出栈失败
}
StackNode *temp = stack->top; // 临时保存栈顶节点
*value = temp->data; // 通过指针参数返回栈顶值
stack->top = temp->next; // 更新栈顶指针
free(temp); // 释放原栈顶节点
stack->size--; // 栈大小减少
return 1; // 出栈成功
}
int top(LinkedStack *stack, int *value) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
return 0; // 获取失败
}
*value = stack->top->data; // 通过指针参数返回栈顶值
return 1; // 获取成功
}
void destroyStack(LinkedStack *stack) {
StackNode *current = stack->top;
StackNode *next;
while (current != NULL) {
next = current->next; // 保存下一个节点地址
free(current); // 释放当前节点
current = next; // 移动到下一个节点
}
stack->top = NULL; // 重置栈顶指针
stack->size = 0; // 重置栈大小
}
#include <stdio.h>
#include <stdlib.h>
typedef struct StackNode {
int data;
struct StackNode *next;
} StackNode;
typedef struct LinkedStack {
StackNode *top;
int size;
} LinkedStack;
void initStack(LinkedStack *stack) {
stack->top = NULL;
stack->size = 0;
}
int isEmpty(LinkedStack *stack) {
return stack->top == NULL;
}
int push(LinkedStack *stack, int value) {
StackNode *newNode = (StackNode*)malloc(sizeof(StackNode));
if (newNode == NULL) {
printf("Memory allocation failed!\n");
return 0;
}
newNode->data = value;
newNode->next = stack->top;
stack->top = newNode;
stack->size++;
return 1;
}
int pop(LinkedStack *stack, int *value) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
return 0;
}
StackNode *temp = stack->top;
*value = temp->data;
stack->top = temp->next;
free(temp);
stack->size--;
return 1;
}
int top(LinkedStack *stack, int *value) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
return 0;
}
*value = stack->top->data;
return 1;
}
void destroyStack(LinkedStack *stack) {
StackNode *current = stack->top;
StackNode *next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
stack->top = NULL;
stack->size = 0;
}
void printStack(LinkedStack *stack) {
printf("Stack (top to bottom): ");
StackNode *current = stack->top;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
LinkedStack stack;
initStack(&stack);
// 测试入栈
push(&stack, 10);
push(&stack, 20);
push(&stack, 30);
printStack(&stack); // 输出: 30 20 10
// 测试获取栈顶元素
int topValue;
if (top(&stack, &topValue)) {
printf("Top element: %d\n", topValue); // 输出: 30
}
// 测试出栈
int poppedValue;
pop(&stack, &poppedValue);
printf("Popped: %d\n", poppedValue); // 输出: 30
printStack(&stack); // 输出: 20 10
// 测试栈空判断
printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No"); // 输出: No
// 销毁栈
destroyStack(&stack);
printf("Is stack empty after destruction? %s\n", isEmpty(&stack) ? "Yes" : "No"); // 输出: Yes
return 0;
}
可以通过链表实现多个栈共享同一存储空间,比顺序结构的多栈共享更灵活。
使用void指针或宏定义可以实现支持任意数据类型的链式栈:
typedef struct GenericStackNode {
void *data;
struct GenericStackNode *next;
} GenericStackNode;
通过添加互斥锁可以实现线程安全的链式栈:
#include <pthread.h>
typedef struct ThreadSafeStack {
StackNode *top;
int size;
pthread_mutex_t lock;
} ThreadSafeStack;
链式栈通过链表结构实现了栈的先进后出特性,相比顺序栈具有更好的灵活性,不受固定大小的限制。本文详细介绍了链式栈的数据结构设计、基本操作实现以及相关应用场景。理解链式栈的实现原理不仅有助于掌握栈这种基础数据结构,也为学习更复杂的链式结构打下了坚实基础。
在实际开发中,应根据具体需求选择顺序栈或链式栈。对于大小可预估且变化不大的场景,顺序栈更为高效;而对于大小不可预知或变化较大的情况,链式栈则是更好的选择。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。