我是靠谱客的博主 坚定向日葵,最近开发中收集的这篇文章主要介绍利用顺序栈(基于数组)实现十进制转换输出其他进制数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:利用顺序栈实现将任意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型,运行报错,所以我定义了一个枚举类型来判断,当然也可以用宏定义。输入的时候增加了合法性的判断,运行结果如下


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

最后

以上就是坚定向日葵为你收集整理的利用顺序栈(基于数组)实现十进制转换输出其他进制数的全部内容,希望文章能够帮你解决利用顺序栈(基于数组)实现十进制转换输出其他进制数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部