利用顺序栈(基于数组)实现十进制转换输出其他进制数

题目:利用顺序栈实现将任意10进制数转换成对应的二进制,八进制,16进制输出

思路:利用短除法的原理以及栈先进后出的特点,先构建好一个顺序栈,这里我用的是数组,把每一次整除的余数压进栈里,然后再把栈里的数据依次取出,输出的便是对应进制的结果,需要注意的是十六进制比较特,得判断输出字母的情况

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 50
enum bool{false,true};	//定义枚举型辅助判断
struct stack		//用一个结构体来定义栈
{
	int inter[N];	//存放栈真实数据的数组
	int top;		//栈顶元素
};
struct stack *S_init()		//栈的初始化
{
	struct stack *S = malloc(sizeof(struct stack));
	if(S == NULL)					//判断内存分配
	{
		printf("内存分配失败\n");
		return NULL;
	}
	bzero(S,sizeof(struct stack));	//清空结构体
	S->top = -1;		//初始化top
	return S;
}
enum bool stack_empty(struct stack *S)	//判断栈是否为空
{
	if(S->top == -1)
		return true;
	else 
	return false;
}
enum bool stack_full(struct stack *S)	//判断栈是否满了
{
	if(S->top == N-1)
		return true;
	else
		return false;
}
enum bool stack_push(struct stack *S,int x)	//入栈(插入新元素)
{
	if(!stack_full(S))	//栈不满时插入
	{
		S->inter[++S->top] = x;
		return true;
	}
	else
	{
		printf("栈已满,无法入栈!\n");
		return false;
	}
}
int stack_pop(struct stack *S)//退栈
{
	if(!stack_empty(S))		//栈不为空的时候,取出栈顶元素
	{
		if(S->inter[S->top] == 10)//判断十六进制时每一位输出字母的情况
			printf("A");
		else if(S->inter[S->top] == 11)
			printf("B");
		else if(S->inter[S->top] == 12)
			printf("C");
		else if(S->inter[S->top] == 13)
			printf("D");
		else if(S->inter[S->top] == 14)
			printf("E");
		else if(S->inter[S->top] == 15)
			printf("F");
		else
		printf("%d",S->inter[S->top]);	//打印栈顶元素
		S->top--;
	}
	else
		printf("栈是空的\n");
}
int SysConvert(int n,int m)//进制转换,n为需要转换的十进制数,m为目标进制
{
	struct stack *St = S_init();
	while(n)
	{
		if(stack_push(St,n%m))		//将每一次的余数压入栈
			n = n/m;
		else 
		break;
	}
	printf("转换后的结果为:");
	while(!stack_empty(St))
	{
		stack_pop(St);
	}
	return 0;
}
int main(int argc, char const *argv[])
{
	int m,n;
	printf("请输入你要转换的十进制数:");
	while(1)
	{
		if(scanf("%d",&n) && getchar() == '\n')//判断输入的合法性
			break;
		printf("输入不合法,请重新输入:");
		while(getchar() != '\n');
	}
	printf("请输入要转换的进制:");
	while(1)
	{
		if(scanf("%d",&m)&&((m == 2)||(m == 8)||(m == 16))&&(getchar() == '\n'))//判断输入的合法性
			break;
			printf("输入进制数不合法,请重新输入:");
			while(getchar() != '\n');
	}
	SysConvert(n,m);
	printf("\n");
	return 0;
}

PS:我用的是Linux下的gcc编译,貌似不支持bool型,运行报错,所以我定义了一个枚举类型来判断,当然也可以用宏定义。输入的时候增加了合法性的判断,运行结果如下


刚学栈没多久,程序不足之处希望大家指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值