3.2.1--栈的应用(数制转换)

3.2.1–栈的应用(数制转换)

数制转换

在计算机中经常面对不同数制的转换问题,如将一个十进制数N转换为d进制B。数制转换的解决方法很多,其中一个简单的转换算法是重复下述两步。直到N等于零为止。
x = N mod d
N = N div d
其中,N为需要转换的十进制数,d为转换后的进制,x值为转换后各个数位上的数,div为整除运算,mod为求余运算。算法的运行过程为:第一次求出的x值为d进制数的最低位,最后一次求出的x值为d进制数的最高位,所以上述算法是从低位到高位顺序产生d进制的各位,然后逆序输出,因为它按“后进先出”的规律进行的,所以用栈这种结构处理最合适。根据这个特点,利用栈来实现上述数制转换,即将计算过程种一次得到的d进制数码按顺序栈进栈。计算结束后,再返顺序出栈,并按出栈顺序打印输出。这样即可得到给定的十进制数对应的d进制数,由此可以得到数制转换的算法。
代码:

#include<iostream>//ZJJ数据据结构-栈3.1
using namespace std;
#define MAXSIZE 100
typedef struct SequenStack {/*定义顺序栈*/
	int data[MAXSIZE];
	int top;
}SequenStack;
SequenStack* Init_SequenStack()/*判(顺序栈)栈空*/
{
	SequenStack* s = (SequenStack*)malloc(sizeof(SequenStack));
	if (s == NULL)
	{
		cout << "栈创建失败" << endl;
		return s;
	}
	s->top = -1;
	return s;
}
int SequentStackEmpty(SequenStack* s)/* 判空栈(顺序栈)*/
{
	if (s->top == -1)
	{
		cout << "栈为空" << endl;
	}
	else {
		return 0;
	}
}
SequenStack* push(SequenStack* s, int e)/* 入栈(顺序栈) */
{
	if (s->top >= MAXSIZE - 1)
	{
		cout << "栈已满,无法压入" << endl;
		return 0;
	}
	else {
		s->top++;
		s->data[s->top] = e;
	}
	return s;
}
SequenStack* pop(SequenStack* s)/* 出栈(顺序栈) */
{
	if (s->top == -1)
	{
		cout << "栈为空,无法弹出" << endl;
		return 0;
	}

	cout << "弹出元素为:" << s->data[s->top] << endl;
	s->top--;
	return s;
}
void print(SequenStack* s)/* 入栈(顺序栈) */
{
	cout << "转化的数为:" << endl;
	while (s->top >= 0)
	{
		cout << s->data[s->top];
		s->top--;
	}
}
void conversion()/* 进制转换算法 */
{
	SequenStack* s = Init_SequenStack();
	int N, n, a, b;
	cout << "输入你要转化的十进制数N:" << endl;
	cin >> N;
	cout << "输入你要转化的进制n:" << endl;
	cin >> n;
	a = N / n;
	while (a > 0)
	{
		b = N % n;
		N = a;
		a = N / n;
		push(s, b);
	}
	if (a == 0)
	{
		b = N % n;
		N = a;
		a = N / n;
		push(s, b);
	}
	print(s);
}
int main()
{
	cout << "数制转换(N为十进制数,n为其他进制数):" << endl;
	conversion();
}

运行结果:
请添加图片描述

有无欠缺的,欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZJJ啥都学不会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值