栈实现的二进制转十进制和八进制

栈实现的二进制转十进制,二进制转八进制

一个二进制的数转换成一个十进制的数很简单,只需要利用一个栈就可以了。当我们输入“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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值