#include <stdio.h>
#include <stdlib.h>
//不带头节点
//定义链式栈的节点结构
typedef struct StackNode{
int data;
struct StackNode *next;
}StackNode;
//定义链式栈的结构
typedef struct{
StackNode *top;
}LinkStack;
//初始化链式栈
void InitStack(LinkStack *s){
s->top=NULL;
}
//新元素入栈
bool Push(LinkStack *s,int x){
StackNode *newNode=(StackNode *)malloc(sizeof(StackNode));
if(newNode==NULL){
return false;
}
newNode->data=x;
newNode->next=s->top;
s->top=newNode;
return true;
}
//元素出栈
bool Pop(LinkStack *s,int *x){
if(s->top==NULL){
return false;
}
StackNode *temp=s->top;
*x=temp->data;
s->top=temp->next;
free(temp);
return true;
}
//读栈顶的元素
bool ReadTop(LinkStack *s,int *x){
if(s->top==NULL){
return false;
}
*x=s->top->data;
return true;
}
//判断栈是否为空
bool IsEmpty(LinkStack *s){
return (s->top==NULL);
}
//销毁栈
void DestroyStack(LinkStack *s){
while(s->top!=NULL){
StackNode *temp=s->top;
s->top=s->top->next;
free(temp);
}
}
// 栈的示例使用
int main() {
LinkStack stack;
InitStack(&stack);
int value;
// 入栈操作
if (Push(&stack, 1)) {
printf("1 入栈成功\n");
} else {
printf("1 入栈失败\n");
}
if (Push(&stack, 2)) {
printf("2 入栈成功\n");
} else {
printf("2 入栈失败\n");
}
// 读栈顶元素
if (ReadTop(&stack, &value)) {
printf("当前栈顶元素是: %d\n", value);
} else {
printf("栈为空\n");
}
// 出栈操作
if (Pop(&stack, &value)) {
printf("%d 出栈成功\n", value);
} else {
printf("出栈失败\n");
}
// 再次读栈顶元素
if (ReadTop(&stack, &value)) {
printf("当前栈顶元素是: %d\n", value);
} else {
printf("栈为空\n");
}
// 销毁栈
DestroyStack(&stack);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//带头结点
// 定义链式栈的节点结构
typedef struct StackNode {
int data;
struct StackNode *next;
} StackNode;
// 定义链式栈的结构
typedef struct {
StackNode *top;
} LinkStack;
// 初始化链式栈
void InitStack(LinkStack *s) {
s->top = (StackNode *)malloc(sizeof(StackNode)); // 分配头结点
if (s->top == NULL) {
printf("内存分配失败\n");
exit(1);
}
s->top->next = NULL; // 头结点的 next 指向 NULL
}
// 新元素入栈
bool Push(LinkStack *s, int x) {
StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
if (newNode == NULL) {
return false; // 内存分配失败
}
newNode->data = x;
newNode->next = s->top->next; // 新节点的 next 指向当前栈顶节点
s->top->next = newNode; // 头结点的 next 指向新节点
return true;
}
// 元素出栈
bool Pop(LinkStack *s, int *x) {
if (s->top->next == NULL) {
return false; // 栈空
}
StackNode *temp = s->top->next; // 保存当前栈顶节点
s->top->next = temp->next; // 头结点的 next 指向新的栈顶节点
*x = temp->data; // 获取栈顶元素的数据
free(temp); // 释放栈顶节点的内存
return true;
}
// 读栈顶元素
bool ReadTop(LinkStack *s, int *x) {
if (s->top->next == NULL) {
return false; // 栈空
}
*x = s->top->next->data; // 获取栈顶元素的数据
return true;
}
// 判断栈是否为空
bool IsEmpty(LinkStack *s) {
return (s->top->next == NULL);
}
// 销毁栈
void DestroyStack(LinkStack *s) {
StackNode *current = s->top->next;
StackNode *next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
free(s->top); // 释放头结点的内存
}
// 栈的示例使用
int main() {
LinkStack stack;
InitStack(&stack);
int value;
// 入栈操作
if (Push(&stack, 1)) {
printf("1 入栈成功\n");
} else {
printf("1 入栈失败\n");
}
if (Push(&stack, 2)) {
printf("2 入栈成功\n");
} else {
printf("2 入栈失败\n");
}
// 读栈顶元素
if (ReadTop(&stack, &value)) {
printf("当前栈顶元素是: %d\n", value);
} else {
printf("栈为空\n");
}
// 出栈操作
if (Pop(&stack, &value)) {
printf("%d 出栈成功\n", value);
} else {
printf("出栈失败\n");
}
// 再次读栈顶元素
if (ReadTop(&stack, &value)) {
printf("当前栈顶元素是: %d\n", value);
} else {
printf("栈为空\n");
}
// 再次出栈操作
if (Pop(&stack, &value)) {
printf("%d 出栈成功\n", value);
} else {
printf("出栈失败\n");
}
// 再次读栈顶元素
if (ReadTop(&stack, &value)) {
printf("当前栈顶元素是: %d\n", value);
} else {
printf("栈为空\n");
}
// 销毁栈
DestroyStack(&stack);
return 0;
}