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

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

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

前言

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

一、什么是链式栈

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

二、讲解步骤

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.讲解入栈:首先,入栈的话,肯定的需要找到我们应该在哪里入栈对吧?其次的话,我们还要考虑选择入什么数据对吧?所以形参的话,我们选择的是一个二级指针的节点,以及一个数据。再则来说的话,我们应该知道我们首先是只有个节点的对吧?就如下图一样,那么我们是不是应该开辟一个节点给他呢?,是的呢没错!

a28b339213664087842675b9ed148ca3.png

那么现在是不是这样的呢?我们需要让我们最开始的节点指向我们的下一个节点这样才算把他们链接起来了呢,并且我们还需要把t往前挪,因为t一直都是我们的头呢

aff3ba35c37c45eeaa95f85d62b2157d.png

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

目录
相关文章
|
C语言
C语言之将十进制整数转换为任意进制整数
C语言之将十进制整数转换为任意进制整数
233 0
|
5月前
|
算法
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
|
算法 Python
十进制与二进制的互换
十进制与二进制的互换
130 0
【进制转换】— 包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细
【进制转换】— 包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细
|
算法 C语言
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
|
算法
算法练习题(四)——十六进制和十进制的相互转换
算法练习题(四)——十六进制和十进制的相互转换
172 0
|
C语言
c语言实现二进制八进制十进制和十六进制的相互转化
c语言实现二进制八进制十进制和十六进制的相互转化
303 0
|
算法 Java 程序员
使用位运算方法实现十进制数字转换为十六进制数
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
使用位运算方法实现十进制数字转换为十六进制数
|
程序员
笔记:二进制、八进制、十进制、十六进制的互相转换
二进制、八进制、十进制、十六进制的互相转换
笔记:二进制、八进制、十进制、十六进制的互相转换
|
算法 C语言
C语言实现10进制转变成2进制,8进制,16进制,字符‘0’-‘9’
C语言实现10进制转变成2进制,8进制,16进制,字符‘0’-‘9’
239 0
C语言实现10进制转变成2进制,8进制,16进制,字符‘0’-‘9’