概述
题目:利用顺序栈实现将任意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型,运行报错,所以我定义了一个枚举类型来判断,当然也可以用宏定义。输入的时候增加了合法性的判断,运行结果如下
刚学栈没多久,程序不足之处希望大家指出。
最后
以上就是坚定向日葵为你收集整理的利用顺序栈(基于数组)实现十进制转换输出其他进制数的全部内容,希望文章能够帮你解决利用顺序栈(基于数组)实现十进制转换输出其他进制数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复