数据结构C语言版:栈的链式存储

数据结构C语言版:栈的链式存储

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR -1
typedef char ElemType; // 数据类型使用char

typedef struct StackNode {
	ElemType data; // 存放栈的数据
	struct StackNode* next; // 指向下一个结点的指针
}StackNode,*LinkStackPtr;

typedef struct LinkStack {
	LinkStackPtr top; // 栈顶指针
	int count; // 存放栈数据个数
}LinkStack;

// 初始化栈
InitStack(LinkStack* s) {
	// 给s动态分配空间
	s = (LinkStack*)malloc(sizeof(LinkStack));
	if (!s) { // 分配失败,则退出
		exit(0);
	}
	s->top = NULL; // 最开始,栈顶指针为空
	s->count = 0; // 数据个数为0
	return s;
}

// 入栈操作
Push(LinkStack* s, ElemType e) {
	LinkStackPtr p; // 定义一个指针用来存储数据的地址
	p = (LinkStackPtr*)malloc(sizeof(StackNode)); // 分配空间
	p->data = e; // 进行赋值操作
	p->next = s->top; // 将栈顶赋值给p的下一个地址也就是NULL
	s->top = p; // 重新把p作为栈顶
	s->count++; // 栈的数据数加一
	return OK;
}

// 出栈操作
Pop(LinkStack* s, ElemType* e) {
	LinkStackPtr p; // 定义一个指针用来存储数据的地址
    // 如果栈为空,则退出
	if (s->count == 0) {
		return ERROR;
	}
	*e = s->top->data; // 链式存储栈顶指针指向的地址是有数据的和顺序存储不一样
	p = s->top; // 将栈顶指向的地址赋值给临时指指针变量p
	s->top = p->next; // 栈顶向下移一个
	free(p); // 释放临时变量p的空间
	s->count--; // 栈的数据数减一
	return OK;
}

// 主函数
int main() {
	LinkStack* s = NULL;
	ElemType e; // 定义一个变量用于接收数据
	s = InitStack(s); // 初始化栈
	printf("请输入你要入栈的的数据输入回车结束!\n");
	printf("入栈序列为:");
	scanf("%c", &e);
	while (e != '\n') {
		Push(&s, e);
		scanf("%c", &e);
	}
	printf("出栈序列为:");
	while (s->count != 0) {
		Pop(&s, &e);
		printf("%c", e);
	}
	putchar('\n');
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅兮昂

你的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值