在写代码之前,我们首先要了解关于顺序栈的实现和十进制转化为二进制的实现。对于第一个关于顺序栈的实现,我在之前的博客里有详细的介绍,顺序栈的实现? ?(? 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);
}
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);
}