#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
// 定义链式栈的节点结构
typedef struct node {
data_t data;
struct node* next;
} node_t;
// 定义链式栈结构
typedef struct {
node_t* top; // 栈顶指针
int size; // 栈中元素个数
} lstack_t;
// 函数声明
int LStack_Create(lstack_t* s);
int LStack_Push(lstack_t* s, data_t data);
int LStack_Pop(lstack_t* s, data_t* data);
void LStack_Free(lstack_t* s);
// 创建/初始化链式栈
int LStack_Create(lstack_t* s) {
if (s == NULL) {
return -1;
}
s->top = NULL;
s->size = 0;
return 0;
}
// 入栈
int LStack_Push(lstack_t* s, data_t data) {
if (s == NULL) {
return -1;
}
// 创建新节点
node_t* new_node = (node_t*)malloc(sizeof(node_t));
if (new_node == NULL) {
return -1;
}
// 初始化新节点
new_node->data = data;
new_node->next = s->top;
// 更新栈顶指针
s->top = new_node;
s->size++;
return 0;
}
// 出栈
int LStack_Pop(lstack_t* s, data_t* data) {
if (s == NULL || s->top == NULL) {
return -1;
}
// 保存栈顶数据
*data = s->top->data;
// 保存栈顶节点指针
node_t* temp = s->top;
// 更新栈顶指针
s->top = s->top->next;
// 释放原栈顶节点
free(temp);
s->size--;
return 0;
}
// 回收栈
void LStack_Free(lstack_t* s) {
if (s == NULL) {
return;
}
// 逐个释放所有节点
while (s->top != NULL) {
node_t* temp = s->top;
s->top = s->top->next;
free(temp);
}
s->size = 0;
}
int main() {
lstack_t s;
// 创建栈
if (LStack_Create(&s) != 0) {
printf("栈创建失败\n");
return -1;
}
// 测试入栈
for (int i = 1; i < 12; i++) {
if (LStack_Push(&s, i) != 0) {
printf("入栈失败: %d\n", i);
break;
}
}
// 测试出栈
printf("出栈顺序: ");
while (s.size > 0) {
data_t data;
if (LStack_Pop(&s, &data) == 0) {
printf("%3d", data);
}
}
printf("\n");
// 回收栈
LStack_Free(&s);
return 0;
}
运行结果: