栈的链式存储结构--不带头结点和带头结点(C数据结构)

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值