利用链式栈实现八进制转换成十进制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

随着科技的发展,数据结构在生活中的出现越来越多啦,那么作为新时代的程序猿,我们是不是更应该追随者时代的脚步呢?我们要紧跟时事,这样才不会轻易被时间所淘汰噢!

一、什么是链式栈?

概要:链式栈其实是基于链表来写的,那么什么是链表呢?链表其实就是一种链式结构,他的物理空间的存储其实就是一个指针域,一个数据域。一个用来存储下一个数据的地址的,一个用来存储当前位置的数据域的,好啦,原理讲的差不多了,我们该进入代码实训了噢!

二、讲解步骤

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走了哦,学习是自己的事情啦!以上就是今天的小节了呢!加油吧少年!

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

M malloc

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值