栈是一种受操作限制(后进先出)的数据结构,链表、数组在功能上可以替代栈,比栈还灵活
为什么要使用栈呢?
首先,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。
比如,浏览器的前进、后退功能,递归
同样可以思考其他数据结构的用途,在那个地方发挥它的作用,为什么被创建
目录
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 也可以 ,看你喜欢什么