链表栈 --- C语言(为什么使用栈)

栈是一种受操作限制(后进先出)的数据结构,链表、数组在功能上可以替代栈,比栈还灵活

为什么要使用栈呢?

首先,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。

比如,浏览器的前进、后退功能,递归

同样可以思考其他数据结构的用途,在那个地方发挥它的作用,为什么被创建


目录

1.头文件

2.结构体

3.创建栈

4.销毁栈

5.入栈

6.出栈

7.输出栈元素

8.主函数

9.判断栈为空


1.头文件

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

2.结构体

typedef struct _linkliststrack {
	int data;
	struct _linkliststrack* next;
}linklist_stack;

3.创建栈

linklist_stack* stack_create() {
	linklist_stack* stack = NULL;
	stack = (linklist_stack*)malloc(sizeof(linklist_stack));
	if (stack == NULL) {
		return NULL;
	}
	stack->next = NULL;
	return stack;
}

4.销毁栈

void stack_destory(linklist_stack* stack) {
	linklist_stack* ptmp = NULL;
	while (stack->next != NULL) {
		ptmp = stack->next;
		stack->next = stack->next->next;
		free(ptmp);
	}
	free(stack);
	return;
}

5.入栈

int stack_push(linklist_stack* stack, int data) {
	linklist_stack* ptmp = NULL;
	ptmp = (linklist_stack*)malloc(sizeof(linklist_stack));
	if (ptmp == NULL) {
		return -1;
	}
	ptmp->data = data;
	ptmp->next = stack->next;
	stack->next = ptmp;
	return 0;
}

6.出栈

int stack_pop(linklist_stack* stack, int* data) {
	linklist_stack* ptmp = NULL;
	if (data == NULL) {
		return -1;
	}
	if (stack->next == NULL) {
		return -1;
	}
	*data = stack->next->data;            /*这一行的意义是什么?为什么传data值*/
	ptmp = stack->next;
	stack->next = ptmp->next;
	free(ptmp);
	return 0;
}

7.输出栈元素

void stack_dump(linklist_stack* stack) {
	linklist_stack* ptmp = stack->next;
	while (ptmp != NULL) {
		printf("%d\n", ptmp->data);
		ptmp = ptmp->next;
	}
	return;
}

8.主函数

int main() {
	linklist_stack* stack = NULL;
	stack = stack_create();
	if (stack == NULL) {
		printf("stack create falied.\n");
		return 0;
	}

	printf("请输入插入队列值(100结束插入):\n");
	int p = 0;
	while (p != 100) {
		scanf_s("%d", &p);
		stack_push(stack, p);
	}
	stack_dump(stack);
	stack_destory(stack);
	return 0;
}

9.判断栈为空

stack->next == NULL

 

 

这个代码有个不好的地方,在主函数里面,判断插入结束时,使用了100这个数值,使它入栈,如果你喜欢好看,可以在while底下做 stack_pop(stack , 100);出队100

while(1){

        if(p == 100)break;

}

我用 while 是因为好看加上 for 有点制约,for 也可以 ,看你喜欢什么

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值