#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 栈节点的结构体定义
typedef struct StackNode {
int data; // 数据域
struct StackNode *next; // 指针域,指向下一个节点
} StackNode, *LinkStack;
// 初始化栈
LinkStack InitStack() {
LinkStack stack = (LinkStack)malloc(sizeof(StackNode));
if (!stack) {
exit(EXIT_FAILURE);
}
stack->next = NULL; // 栈顶指针指向NULL,表示空栈
return stack;
}
// 判断栈是否为空
bool IsEmpty(LinkStack stack) {
return stack->next == NULL;
}
// 入栈
bool Push(LinkStack stack, int e) {
StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
if (!newNode) {
exit(EXIT_FAILURE);
}
newNode->data = e;
newNode->next = stack->next; // 新节点插入到栈顶
stack->next = newNode;
return true;
}
// 出栈
bool Pop(LinkStack stack, int *e) {
if (IsEmpty(stack)) {
return false; // 栈为空,无法出栈
}
StackNode *temp = stack->next; // 临时保存栈顶节点
*e = temp->data; // 获取栈顶元素的值
stack->next = temp->next; // 栈顶指针下移
free(temp); // 释放原栈顶节点
return true;
}
// 获取栈顶元素
bool GetTop(LinkStack stack, int *e) {
if (IsEmpty(stack)) {
return false; // 栈为空,无法获取栈顶元素
}
*e = stack->next->data; // 获取栈顶元素的值
return true;
}
// 销毁栈
void DestroyStack(LinkStack stack) {
StackNode *temp;
while (stack->next != NULL) {
temp = stack->next;
stack->next = temp->next;
free(temp);
}
free(stack);
}
int main() {
// 初始化一个链栈
LinkStack stack = InitStack();
// 向链栈中压入元素1
Push(stack, 1);
// 向链栈中压入元素2
Push(stack, 2);
// 向链栈中压入元素3
Push(stack, 3);
// 声明一个整型变量来保存栈顶元素的值
int topElem;
// 获取栈顶元素的值,并保存到变量topElem中
if (GetTop(stack, &topElem)) {
printf("栈顶元素是: %d\n", topElem);
}
// 声明一个整型变量来保存出栈元素的值
int poppedElem;
// 从链栈中弹出一个元素,并保存到变量poppedElem中
if (Pop(stack, &poppedElem)) {
printf("弹出的元素是: %d\n", poppedElem);
}
if (Pop(stack, &poppedElem)) {
printf("弹出的元素是: %d\n", poppedElem);
}
// 判断链栈是否为空
if (IsEmpty(stack)) {
printf("链栈是空的.\n");
} else {
printf("链栈不是空的.\n");
}
// 销毁链栈,释放内存
DestroyStack(stack);
// 程序正常结束
return 0;
}
运行结果: