数据结构:利用顺序栈实现十进制转化为二进制(含注释和完整代码,可复制)

在写代码之前,我们首先要了解关于顺序栈的实现和十进制转化为二进制的实现。对于第一个关于顺序栈的实现,我在之前的博客里有详细的介绍,顺序栈的实现   (  http://t.csdnimg.cn/cWJXn),在这里就不过多的介绍。对于十进制转二进制,它可以采用除2取余法,首先不断将十进制除以2,每次记录余数,直到商数为0为止,然后将得到的所有余数全部排列起来,再将它反过来(逆序排列)。

1.关于顺序栈的代码

typedef struct /*定义顺序栈*/
{
int data[Maxsize];
int Top;
} stack;

void Initstack( stack *s ) /*栈的初始化*/
{
s->Top=0;
}

int push(stack *s,int x) /*入栈*/
{
	if(s->Top!=Maxsize-1)
		{
		s->Top++;
		(s->data)[s->Top]=x;
		return 1;
		}
	else
	{return 0;}
}

int pop(stack *s) /*出栈*/
{
int x;
if(s->Top!=0)
	{
	x=(s->data)[s->Top];
	s->Top--;
	return x;
	}
else
	{return -1;}
}

2.进制转换代码

方法一:下面这段代码是一个用 C 语言实现的数制转换函数,将输入的整数  x  转换为二进制数,并将结果存储在栈  s  中,最后将栈中的二进制数转换为十进制数并返回。

下面分段解释这段代码的功能:

1. 声明一个栈结构变量  s ,并分配栈的内存空间。

2. 调用  Initstack()  函数初始化栈。

3. 使用一个  do-while  循环,将输入的整数  x  逐次除以 2,取余数,并将余数压入栈中。

4. 初始化两个变量  y  和  z ,用于存储最终的十进制结果。

5. 使用一个  do-while  循环,将栈中的元素逐次弹出,并乘以 10 后与  y  相加,同时将弹出的元素存储在  z  中。

6. 循环结束后,返回最终的十进制结果  y 。

总体来说,这段代码通过将输入的整数逐次除以 2 并取余数的方式,将二进制数逐位存储在栈中,然后再逐位将二进制数转换为十进制数并返回。

int transform(int x) /*实现转换*/
{
stack *s=(stack *)malloc(sizeof(stack)); 
Initstack( s );
int y,z;
do
	{
	y=x%2;
	x=x/2;
	push(s,y);
	}while(x!=0);
z=0;
y=0;
do
	{
	y=10*y+z;
	z=pop(s);
	}while(z!=-1);
     return y;
}

int main()
{
int x,y;
printf("请输入一个十进制数:");scanf("%d",&x);
printf("\n");
y=transform(x);
printf("此十进制数转换成的二进制数为:%d\n",y);
}

方法二:

将一个整数转换为另一种表示形式,通过逐次除以 2 并将余数入栈,然后再逐次乘以 10 并加上栈顶元素,最终得到转换后的结果。需要注意的是,栈 s 是作为函数的参数传入的,它在函数内部进行操作,并且函数返回的是转换后的结果 y 。

下面这段代码定义了一个名为 transform 的函数,它使用一个栈 stack *s 来实现一个整数到另一个整数的转换。以下是对代码的逐行解释:

1.  int y, z; :声明两个整数变量 y 和 z ,用于临时存储运算结果。

2.  do :开始一个 do-while 循环,只要条件 x != 0 成立,就会执行循环体中的代码。

3.  y = x % 2; :计算 x 除以 2 的余数,并将结果赋值给变量 y 。

4.  x = x / 2; :将 x 除以 2,即右移一位,实现整数的二进制位逐次除以 2。

5.  push(s, y); :将当前的 y 值入栈。

6.  while (x != 0); :循环继续,直到 x 变为 0。

7.  z = 0; :初始化变量 z 为 0。

8.  y = 0; :初始化变量 y 为 0。

9.  do :开始另一个 do-while 循环,只要条件 z != -1 成立,就会执行循环体中的代码。

10.  y = 10 * y + z; :计算 y 的值,将之前入栈的数字逐次乘以 10 并加上当前的 z 值。

11.  z = pop(s); :从栈中弹出一个数字,并将其赋值给变量 z 。

12.  while (z != -1); :循环继续,直到栈为空或 z 变为 -1。

13.  return y; :返回最终计算得到的 y 值,作为转换的结果。

int transform(stack *s,int x) /*实现转换*/
{
 

int y,z;
do
	{
	y=x%2;
	x=x/2;
	push(s,y);
	}while(x!=0);
z=0;
y=0;
do
	{
	y=10*y+z;
	z=pop(s);
	}while(z!=-1);
     return y;
}

int main()
{
int x,y;
stack s;
printf("请输入一个十进制数:");scanf("%d",&x);
printf("\n");
Initstack(&s);
y=transform(&s,x);
printf("此十进制数转换成的二进制数为:%d\n",y);
}

3.完整代码

方法一:

#define Maxsize 100
#include <stdio.h>
#include<malloc.h>
typedef struct /*定义顺序栈*/
{
int data[Maxsize];
int Top;
} stack;

void Initstack( stack *s ) /*栈的初始化*/
{
s->Top=0;
}

int push(stack *s,int x) /*入栈*/
{
	if(s->Top!=Maxsize-1)
		{
		s->Top++;
		(s->data)[s->Top]=x;
		return 1;
		}
	else
	{return 0;}
}

int pop(stack *s) /*出栈*/
{
int x;
if(s->Top!=0)
	{
	x=(s->data)[s->Top];
	s->Top--;
	return x;
	}
else
	{return -1;}
}

int transform(int x) /*实现转换*/
{
stack *s=(stack *)malloc(sizeof(stack)); 
Initstack( s );
int y,z;
do
	{
	y=x%2;
	x=x/2;
	push(s,y);
	}while(x!=0);
z=0;
y=0;
do
	{
	y=10*y+z;
	z=pop(s);
	}while(z!=-1);
     return y;
}

int main()
{
int x,y;
printf("请输入一个十进制数:");scanf("%d",&x);
printf("\n");
y=transform(x);
printf("此十进制数转换成的二进制数为:%d\n",y);
}

 方法二:

#define Maxsize 100
#include <stdio.h>
#include<malloc.h>
typedef struct /*定义顺序栈*/
{
int data[Maxsize];
int Top;
} stack;


void Initstack( stack *s ) /*栈的初始化*/
{
s->Top=0;
}

int push(stack *s,int x) /*入栈*/
{
	if(s->Top!=Maxsize-1)
		{
		s->Top++;
		(s->data)[s->Top]=x;
		return 1;
		}
	else
	{return 0;}
}

int pop(stack *s) /*出栈*/
{
int x;
if(s->Top!=0)
	{
	x=(s->data)[s->Top];
	s->Top--;
	return x;
	}
else
	{return -1;}
}

int transform(stack *s,int x) /*实现转换*/
{
 

int y,z;
do
	{
	y=x%2;
	x=x/2;
	push(s,y);
	}while(x!=0);
z=0;
y=0;
do
	{
	y=10*y+z;
	z=pop(s);
	}while(z!=-1);
     return y;
}

int main()
{
int x,y;
stack s;
printf("请输入一个十进制数:");scanf("%d",&x);
printf("\n");
Initstack(&s);
y=transform(&s,x);
printf("此十进制数转换成的二进制数为:%d\n",y);
}

  • 13
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值