1. **栈的结构定义:**
- `LNode` 结构体定义了链表节点,包含一个整数 `data` 存储数据,以及一个指向下一个节点的指针 `next`。
- `LinkStack` 是指向链表栈的指针。
2. **初始化栈:**
- `Stack_Init` 函数用于初始化栈,将栈顶指针 `pStack` 置为 `NULL` 表示空栈。
3. **判断栈是否为空:**
- `Stack_Empty` 函数通过判断栈顶指针 `pStack` 是否为 `NULL` 来判断栈是否为空。
4. **获取栈有效数据节点个数:**
- `Stack_Length` 函数遍历链表栈,计算链表节点的数量,即栈的长度。
5. **创建栈:**
- `Stack_Create` 函数通过输入数据创建栈,每输入一个数据,创建一个新节点并插入到链表的头部。
6. **新元素入栈:**
- `Stack_Push` 函数将新元素入栈,创建一个新节点,并将其插入到链表的头部。
7. **出栈:**
- `Stack_Pop` 函数将栈顶元素出栈,首先检查栈是否为空,然后删除栈顶节点,并释放相应的内存。
8. **返回栈顶元素:**
- `Stack_Get_Top` 函数返回指向栈顶元素的指针。
9. **打印栈所有值:**
- `Stack_Show` 函数遍历链表栈,打印所有节点的数据。
10. **主函数演示:**
- 主函数演示了栈的初始化、入栈、出栈、获取栈顶元素等操作,并输出相应的结果。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkStack;
// 初始化栈
bool Stack_Init(LinkStack &pStack) {
pStack = NULL;
return true;
}
// 判断栈是否为空
bool Stack_Empty(LinkStack pStack) {
return pStack == NULL;
}
// 获取栈有效数据节点个数
int Stack_Length(LinkStack pStack) {
int length = 0;
LNode *current = pStack;
while (current != NULL) {
length++;
current = current->next;
}
return length;
}
// 创建栈
LinkStack Stack_Create(LinkStack &pStack) {
LNode *pTemp;
int x;
scanf("%d", &x);
while (x != 999) {
pTemp = (LNode *)malloc(sizeof(LNode));
pTemp->data = x;
pTemp->next = pStack;
pStack = pTemp;
scanf("%d", &x);
}
return pStack;
}
// 新元素入栈
bool Stack_Push(LinkStack &pStack, int e) {
LNode *pTemp = (LNode *)malloc(sizeof(LNode));
pTemp->data = e;
pTemp->next = pStack;
pStack = pTemp;
return true;
}
// 出栈
bool Stack_Pop(LinkStack &pStack, int &e) {
if (pStack == NULL) return false;
LNode *p = pStack;
e = p->data;
pStack = pStack->next;
free(p);
return true;
}
// 返回第一个
LNode *Stack_Get_Top(LinkStack pStack) {
return pStack;
}
// 打印栈所有值
void Stack_Show(LinkStack pStack) {
LNode *node = pStack;
printf("栈值:");
while (node != NULL) {
printf("%d、", node->data);
node = node->next;
}
printf("\n");
}
int main() {
int i = -1;
LinkStack pStack;
Stack_Init(pStack);
printf("栈判空:%s\n", Stack_Empty(pStack) ? "空" : "非空");
Stack_Push(pStack, 1);
Stack_Push(pStack, 2);
Stack_Push(pStack, 3);
Stack_Push(pStack, 4);
Stack_Show(pStack);
Stack_Pop(pStack, i);
printf("出栈:%d\n", i);
Stack_Show(pStack);
Stack_Pop(pStack, i);
printf("出栈:%d\n", i);
Stack_Show(pStack);
Stack_Pop(pStack, i);
printf("出栈:%d\n", i);
Stack_Show(pStack);
printf("栈长度:%d\n\n", Stack_Length(pStack));
printf("栈判空:%s\n", Stack_Empty(pStack) ? "空" : "非空");
return 0;
}