#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int datatype; // 定义数据类型为整型
typedef struct Stack
{
datatype data; // 栈中存储的数据
struct Stack *top; // 指向栈顶的指针
} Stack;
int isEmpty(Stack *stack)
{
if(stack->top == NULL) // 如果栈顶指针为空,说明栈为空
return false; // 返回 false 表示栈非空
return true; // 否则返回 true 表示栈为空
}
Stack *InitStack()
{
Stack *stack = (Stack*)malloc(sizeof(Stack)); // 分配一个栈的内存空间
if(stack == NULL)
{
printf("内存空间申请失败!\n"); // 如果内存分配失败,打印提示信息
return NULL;
}
stack->top = NULL; // 初始化栈顶指针为空
return stack; // 返回初始化后的栈
}
void PushStack(Stack *stack, datatype data)
{
if(stack == NULL) // 如果栈为空,直接返回
return ;
Stack *p = (Stack*)malloc(sizeof(Stack)); // 分配一个新节点的内存空间
if(p == NULL)
{
printf("内存空间申请失败!\n"); // 如果内存分配失败,打印提示信息
return ;
}
p->data = data; // 将数据存入新节点
p->top = stack->top; // 新节点指向原栈顶节点
stack->top = p; // 更新栈顶指针为新节点
}
void PopStack(Stack *stack)
{
if(stack == NULL) // 如果栈为空,直接返回
return ;
if(!isEmpty(stack)) // 如果栈为空,直接返回
return ;
Stack *p = stack->top; // 取出栈顶节点
stack->top = p->top; // 更新栈顶指针为下一个节点
printf("%d\n", p->data); // 打印出栈的数据
free(p); // 释放出栈的节点占用的内存空间
p = NULL; // 将指针置空,避免悬空指针
}
int main(int argc, char *argv[])
{
Stack *stack = InitStack(); // 初始化一个栈
PushStack(stack, 1); // 入栈数据 1
PushStack(stack, 2); // 入栈数据 2
PopStack(stack); // 出栈
PopStack(stack); // 出栈
PopStack(stack); // 尝试出栈空栈
return 0;
}
这段代码主要实现了栈的基本功能,包括初始化栈、入栈、出栈、判断栈是否为空等操作。在 main
函数中演示了入栈和出栈操作,尝试了出栈空栈的情况。