链栈C语言实现 --- 数据结构之栈的链式存储
程序员文章站
2022-06-05 14:56:49
...
#include<stdio.h>
#include<stdlib.h>
// 链表中的结点结构
typedef struct Node {
int data; // 数据元素
struct Node *next; // 指向下一个结点
} StackNode, *PStackNode;
typedef struct {
PStackNode top; // 指向栈顶结点
int count; // 栈的大小
} LinkStack, *PLinkStack;
// 初始化链栈,栈顶指针置为NULL,栈的大小置为0
PLinkStack Init_LinkStack() {
PLinkStack S;
S = (PLinkStack)malloc(sizeof(LinkStack));
if (!S) {
return NULL;
}
S->top = NULL;
S->count = 0;
return S;
}
// 判断栈是否为空
int Empty_LinkStack(PLinkStack S) {
return (S->top == NULL);
}
// 入栈,参数e为入栈的元素
void Push_LinkStack(PLinkStack S, int e) {
PStackNode p;
p = (PStackNode)malloc(sizeof(StackNode)); // 创建新的结点
if (!p) {
return;
}
p->data = e; // 赋值元素e
p->next = S->top; // 新的结点next指向栈顶结点
S->top = p; // 更新栈顶结点为新的结点
S->count++; // 栈的大小加一
}
// 出栈,出栈的元素存放在参数e中
int Pop_LinkStack(PLinkStack S, int *e) {
PStackNode p;
if (Empty_LinkStack(S)) { // 判断栈是否为空
printf("Stack NULL!\n");
return 0;
}
*e = S->top->data; // 将栈顶元素赋值给参数e
p = S->top; // 临时存储久的栈顶结点
S->top = S->top->next; // 将栈顶结点更新为久的栈顶结点的下一个结点
free(p); // 释放久的栈顶结点
S->count--; // 栈的大小减一
return 1;
}
// 获取栈顶的元素,存放在参数e中
int GetTop_LinkStack(PLinkStack S, int *e) {
if (Empty_LinkStack(S)) {
printf("Stack NULL!\n");
return 0;
}
*e = S->top->data;
return 1;
}
// 遍历打印栈的所有元素
void Print_LinkStack(PLinkStack S) {
PStackNode p;
if (Empty_LinkStack(S)) {
printf("Stack NULL!\n");
return;
}
p = S->top;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 清空栈
void Clear_LinkStack(PLinkStack S) {
if (Empty_LinkStack(S)) {
return;
}
while (S->count) {
PStackNode p = S->top;
S->top = p->next;
free(p);
S->count--;
}
}
// 返回栈的大小
int Length_LinkStack(PLinkStack S) {
if (!S) {
return 0;
}
return S->count;
}
int main() {
PLinkStack S;
int n, e, i;
printf("input the number of datas :\n");
scanf("%d", &n);
S = Init_LinkStack();
printf("input datas :\n");
for (i = 0; i < n; i++) {
scanf("%d", &e);
Push_LinkStack(S, e);
}
printf("The Stack is :\n");
Print_LinkStack(S);
Pop_LinkStack(S, &e);
printf("The pop data is %d.\n", e);
GetTop_LinkStack(S, &e);
printf("The top data is %d.\n", e);
printf("The new stack is :\n");
Print_LinkStack(S);
printf("The length of stack is %d.\n", Length_LinkStack(S));
printf("Clear the stack :\n");
Clear_LinkStack(S);
Print_LinkStack(S);
printf("The new stack length is %d.\n", Length_LinkStack(S));
return 0;
}