栈实现的二进制转十进制,二进制转八进制
一个二进制的数转换成一个十进制的数很简单,只需要利用一个栈就可以了。当我们输入“11001”这样一串二进制数据,当入栈时,我们把高位先入栈,低位后入栈,然后再出栈。由于栈的特性,后进先出,先出栈的就是低位二进制数。然后按照公式乘以2 ^ 0, 2 ^ 1,2 ^ 2……2^(n-1)等等即可。
重点是二进制转换到八进制,这里利用了两个栈,先将二进制数入栈,然后出栈,再压入另外一个栈中,整个过程如下。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#define MAXSIZE 100
#define INCRESIZE 100
typedef char Elemtype;
typedef struct Sqtack{
Elemtype *base;
Elemtype *top;
Elemtype stacksize;
}sqtack;
typedef struct Sqtack2{
Elemtype *base;
Elemtype *top;
Elemtype stacksize;
}sqtack2;
void Initialtack(sqtack *tack)//初始化栈1
{
tack->base = (Elemtype *)malloc(sizeof(Elemtype)*MAXSIZE);
if (tack->base==NULL)
{
exit(0);
}
tack->top = tack->base;
}
void Initialtack2(sqtack2 *tack)//初始化栈2
{
tack->base = (Elemtype *)malloc(sizeof(Elemtype)*MAXSIZE);
if (tack->base == NULL)
{
exit(0);
}
tack->top = tack->base;
}
void cleartack(sqtack *tack)//清除栈的数据
{
tack->base = tack->top;
}
void Push(sqtack *tack, Elemtype ch)//将ch压入栈
{
if ((tack->top-tack->base)>= MAXSIZE)//如果栈内存大于初始化的MAXSIZE
{
tack->base = (Elemtype *)realloc(tack->base,sizeof(Elemtype)*(INCRESIZE + tack->stacksize));//那么重新分配stacksize+INCRESIZE的字节
if (tack->base==NULL)
{
exit(0);
}
tack->top = tack->base + tack->stacksize;//栈顶指针为当前tack->base+MAXSIZE
tack->stacksize = tack->stacksize + INCRESIZE;
}
*(tack->top) = ch;//将c压入栈顶指针处;
tack->top++;
}
void Push2(sqtack2 *tack, Elemtype ch)//第二个栈同样的道理
{
if ((tack->top - tack->base) >= MAXSIZE)
{
tack->base = (Elemtype *)realloc(tack->base, sizeof(Elemtype)*(INCRESIZE + tack->stacksize));
if (tack->base == NULL)
{
exit(0);
}
tack->top = tack->base + tack->stacksize;
}
*(tack->top) = ch;
tack->top++;
}
Elemtype Pop(sqtack *tack)//栈1出栈
{
Elemtype ch;
if (tack->top == tack->base)
{
return 0;
}
ch = *(--tack->top);//先将栈顶指针减一然后在将元素出栈
return ch;
}
Elemtype Pop(sqtack2 *tack)
{
Elemtype ch;
if (tack->top == tack->base)
{
return 0;
}
ch = *(--tack->top);
return ch;
}
int Stacklen2(sqtack2 *tack)
{
int length = 0;
length = tack->top - tack->base;
return length;
}
void Bitodec(sqtack *tack,char *a,int n,int *sum)//二进制转十进制
{
char b[100] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
Push(tack, *(a+i));//从栈1出栈
}
for (i = 0; i < n; i++)
{
b[i] = (Pop(tack) - 48);//将ascii码转变成数字
*sum = *sum + b[i] * pow(2, i);//乘以2^i次方
}
}
void BitoOc(sqtack *tack1,sqtack2 *tack2,int n,char *p,char *a)//二进制转换成八进制
{
int i = 0,len=0;
char sum = 0;
Elemtype ch=0;
for (i = 0; i < n; i++)
{
Push(tack1, *(a + i));//先将输入的二进制入栈1
}
while(n)
{
for (i = 0; i < 3; i++)
{
ch = Pop(tack1);
sum = sum + (ch - 48)*pow(2, i);
n--;
if (tack1->top == tack1->base)//如果全部都出栈则退出循环
{
break;
}
}
Push2(tack2,sum);//将每3位数计算结果压入栈2
sum = 0;
}
len = Stacklen2(tack2);//计算栈2的长度
for(i=0;i<len;i++)
{
*(p + i) = Pop(tack2) + 48;//将栈2的数转换成ASCII码并且存在一个数组中
}
}
int main(void)
{
sqtack tack;
sqtack2 tack2;
int i=0,j=4,n=0,sum=0;
char a[100] = { 0 };
char b[100] = { 0 };
Initialtack(&tack);
Initialtack2(&tack2);
printf("请输入二进制数的个数\n");
scanf_s("%d",&n);
fscanf_s(stdin,"%s",a,100);
//Bitodec(&tack,a,n,&sum);
BitoOc(&tack, &tack2,n,b,a);
printf("0%s",b);
return 0;
}