提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
随着科技的发展,数据结构在生活中的出现越来越多啦,那么作为新时代的程序猿,我们是不是更应该追随者时代的脚步呢?我们要紧跟时事,这样才不会轻易被时间所淘汰噢!
一、什么是链式栈?
概要:链式栈其实是基于链表来写的,那么什么是链表呢?链表其实就是一种链式结构,他的物理空间的存储其实就是一个指针域,一个数据域。一个用来存储下一个数据的地址的,一个用来存储当前位置的数据域的,好啦,原理讲的差不多了,我们该进入代码实训了噢!
二、讲解步骤
1.讲解链式栈的入栈,出栈
代码如下(示例):
bool ST_Push(SList** t, datatype x)
{
SList* newnode = (SList*)malloc(sizeof(SList));
if (newnode == NULL)
{
printf(“malloc fail”);
return false;
}
newnode->next = NULL;
newnode->data = x;
newnode->next = (*t); (*t) = newnode; return true;
}
bool is_empty(SList* t)
{
if (t == NULL)
return true;
else
return false;
}
bool STack_Pop(SList** t, int data)
{
SList p = *t;
if (is_empty(*t))
return false;
*data = (*t)->data;
*t = p->next;
free§;
return true;
}
上面这三段代码,分为链式栈的入栈,出栈,和判空!
那么我们为什么要写这么多的东西呢?
首先我们要考虑链式栈的结构,他的结构是链式的,每一处都会有属于自己的地址,属于自己的名字。
1.讲解入栈:首先,入栈的话,肯定的需要找到我们应该在哪里入栈对吧?其次的话,我们还要考虑选择入什么数据对吧?所以形参的话,我们选择的是一个二级指针的节点,以及一个数据。再则来说的话,我们应该知道我们首先是只有个节点的对吧?就如下图一样,那么我们是不是应该开辟一个节点给他呢?,是的呢没错!
那么现在是不是这样的呢?我们需要让我们最开始的节点指向我们的下一个节点这样才算把他们链接起来了呢,并且我们还需要把t往前挪,因为t一直都是我们的头呢
2.出栈:出栈我们需要考虑什么呢?首先我们应该知道该出那个栈对吧?其次的话是不是还得弄一个指针来存储我们所出栈的数据!既然知道了那我们就来实现吧!原理其实就是先定义一个临时的指针存储当前位置,然后在把他赋给当前的t,最后在把这个临时的指针个free掉就行啦!
2.利用链式栈实现十进制转换八进制
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int datatype; typedef struct Stack_List { struct Stack_List* next; datatype data; }SList; void STackInit(SList** t) { *t = NULL; } bool ST_Push(SList** t, datatype x) { SList* newnode = (SList*)malloc(sizeof(SList)); if (newnode == NULL) { printf("malloc fail"); return false; } newnode->next = NULL; newnode->data = x; newnode->next = (*t); (*t) = newnode; return true; } bool is_empty(SList* t) { if (t == NULL) return true; else return false; } bool STack_Pop(SList** t, int *data) { SList* p = *t; if (is_empty(*t)) return false; *data = (*t)->data; *t = p->next; free(p); return true; } void dec_otc(int n) { if (n < 0) { printf("number is invaild"); return; } SList* Pop = NULL; STackInit(&Pop); while (n != 0) { ST_Push(&Pop, n % 8); n = n / 8; } int data = 0; while (!is_empty(Pop)) { STack_Pop(&Pop, &data); printf("%d", data); } } int main() { int a = 0; scanf("%d", &a); dec_otc(a); return 0; }
总结
以上就是今天的小实验啦!希望你看完本次博客能有所收获噢!切记不要当cv工程师,一定要有自己的思路,不要直接就把代码copy走了哦,学习是自己的事情啦!以上就是今天的小节了呢!加油吧少年!