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

来源:互联网 发布:servlet 接收json 编辑:程序博客网 时间:2024/06/05 16:27

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

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

代码如下:

#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 50enum 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;//初始化topreturn 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;elsereturn 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");elseprintf("%d",S->inter[S->top]);//打印栈顶元素S->top--;}elseprintf("栈是空的\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型,运行报错,所以我定义了一个枚举类型来判断,当然也可以用宏定义。输入的时候增加了合法性的判断,运行结果如下


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