有趣的数据结构算法9——利用栈完成2进制到8进制的转换

有趣的数据结构算法9——利用栈完成2进制到8进制的转换

刚学习完栈的我想试试栈都可以干嘛,于是找到了一个小应用,利用栈完成2进制到8进制的转换。如果大家还不清楚什么是栈、如何创建栈,可以关注我的博文
https://blog.csdn.net/weixin_44791964/article/details/97029829
在这里插入图片描述

解题思路

利用栈完成2进制到8进制的转换,我们可以先创建两个栈,一个栈用于存储转换前2进制的每一位(简称栈_2),一个栈用于存储转换后8进制的每一位(简称栈_8)。
栈_2与栈_8的不同点是,栈_2的最低端存储的是转换前2进制的最高位,栈_8的最低端存储的是转换后8进制的最低位。
栈_2与栈_8
其解题过程如下:
1、从最高位到最低位依次将2进制的每一位压入栈。
2、每次从栈内取出三位数,计算其对应的八进制数。如果不足三位,则直接计算
3、将得到的八进制数压入八进制的栈
4、重复步骤2、3

实现代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>


#define maxsize 100 //最大size为100
typedef char EleType; //这个地方要用typedef,不可以用define
struct stack{		//stacksize是整型。
	int stacksize;  //指的是这个栈的最大size
	EleType* top;	//top指的指针是最后一位数据的后一个
	EleType* base;  //base指的指针是最低位的指针。
};

void init(struct stack* STA){
	STA->base = (EleType *)malloc(maxsize * sizeof(EleType));	//为base申请内存空间。
	if (!STA->base){											//如果没有申请上,则推出
		exit(1);
	}
	STA->stacksize = maxsize;	//更改stacksize的大小;
	STA->top = STA->base;		//初始化的时候顶端指向尾端
}

void insert(struct stack* STA, EleType e){	//插入数据
	int len;
	EleType* m;
	len = STA->top - STA->base;				//计算总体长度
	if (len >= STA->stacksize){ //如果

		m = (EleType *)realloc(STA->base, (STA->stacksize + maxsize)*sizeof(EleType));
		if (!m){
			exit(1);
		}
		STA->stacksize = STA->stacksize + maxsize;//更新stacksize的值
		STA->base = m; //更新base的值
		STA->top = m + len; //更新top的值
	}
	*(STA->top) = e; //STA->top的值更新,更新后top++
	(STA->top)++;
}

char pop(struct stack* STA){
	char c;
	if (STA->top == STA->base){
		exit(1);	//非法访问,异常退出
	}
	STA->top--;		//应当先将top--,再进行取值
	c = *STA->top;	//top为指针
	return c;

}

void count(struct stack* STA, struct stack* STA_8){
	int len,signal=0;
	int num = 0;
	char c;
	len = STA->top - STA->base;

	for (int i = 0; i < len; i++){
		c = pop(STA);	//取出STA内的值
		if (c == '1')	//当c=='1'的时候计算num
		{
			num = num + (int)pow(2.0, i%3);
		}
		else if (c == '0'){	//当c=='0'的时候num不变
			num = num;
		}
		else				//弹出您输入的数据有误,退出
		{
			printf("您输入的数据有误\n");
			return;
		}
		signal++;
		if (signal == 3 || i == len-1){ //当信号量为3或者到达结尾的时候,记录当时的num值,压栈,初始化signal和num
			signal = 0;
			insert(STA_8, (char)(num + 48));
			num = 0;
		}
	}

}

void getanswer(struct stack* STA_8){
	char c;
	while (STA_8->top != STA_8->base){	//判断时候栈顶到栈底,到达的话则退出循环
		STA_8->top--;
		c = *STA_8->top;
		printf("%c", c);
	}
	printf("\n", c);
}


int main(void){

	struct stack STA,STA_8; //这个地方不能直接定义指针,指针要要指向。
	EleType a;
	
	init(&STA); //使用地址
	init(&STA_8);

	printf("请输入一段二进制数:");
	scanf("%c", &a); //不要使用字符串,效果不好。
	while (a != '#'){
		insert(&STA, a);
		scanf("%c", &a);
	}

	count(&STA,&STA_8);
	getanswer(&STA_8);
	return 0;
}

GITHUB下载连接

https://github.com/bubbliiiing/Data-Structure-and-Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bubbliiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值