用栈实现将十进制数转换为任意进制数(2,8,16...).
2016-03-06 15:19
169 查看
解题思路:假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下;
N N/n N%n
231 28 7
28 3 4
3 0 3
则输出为347,可以看出,首先得到的应该是7,然后才是4,最后是3,但是要逆序显示,自然就类似压栈出栈的数据结构了(数组也可以实现,但是没有体现其本质).
所以,只需要初始化栈后,将N%n不断的压入栈底,需要注意的是如果要转换为16进制,则需要对大于9的数字作字符处理。
N N/n N%n
231 28 7
28 3 4
3 0 3
则输出为347,可以看出,首先得到的应该是7,然后才是4,最后是3,但是要逆序显示,自然就类似压栈出栈的数据结构了(数组也可以实现,但是没有体现其本质).
所以,只需要初始化栈后,将N%n不断的压入栈底,需要注意的是如果要转换为16进制,则需要对大于9的数字作字符处理。
#include <stdio.h> #include <malloc.h> //malloc #include <math.h> //含有overflow #define S_SIZE 100 //栈的空间大小 typedef struct SqStack{ int top; //栈顶 int maxtop; //栈最大的存储空间 int *stack; }SqStack; //初始化空栈 void InitStack(SqStack &S) { S.stack=(int *)malloc(S_SIZE*sizeof(int)); //动态申请一维数组 S.maxtop=S_SIZE; S.top=-1; } //判断空栈 int StackEmpty(SqStack &S) { if(S.top==-1) return 1; else return 0; } //判断栈满 int StackFull(SqStack &S) { if(S.top==S.maxtop) return 1; else return 0; } //进栈 void push(SqStack &S,int x) { if(StackFull(S)) printf("overflow\n"); S.stack[++S.top]=x; } //出栈 int pop(SqStack &S) { int x; if(StackEmpty(S)) printf("underflow\n"); x=S.stack[S.top]; S.top--; return x; } //进制转化函数 void convert(SqStack &S,int N,int n) { int i,x; do { push(S,N%n); N/=n; } while (N!=0); while(!StackEmpty(S)) { x=pop(S); if(x>9) //十六进制时输出字母 { x=x+55; printf("%c",x); } else printf("%d",x); } printf("\n"); } //清空栈 void StackClear(SqStack &S) { S.top=-1; } int main() { int n,N;//要转换成的进制数和要转换的数 SqStack s; scanf("%d%d",&n,&N) ; InitStack(s); printf("%d转换为%d进制后为:\n",n,N); convert(s,n,N); StackClear(s); return 0; }
相关文章推荐
- hdu 1019
- 30以内四则运算程序
- 水池数目 ----- 图中有几个 单块的区域
- LA 2512 半平面交
- HandlerThread 使用及其源码完全解析
- TCP/IP Note1
- 构建之法阅读笔记01
- CSDN新家,技术博客交流处,欢迎大家交流!
- [LeetCode]166. Fraction to Recurring Decimal
- AngularJS 入门2
- Android菜鸟的成长笔记——PopupMenu使用
- 歌词解析总结
- 不重启修改计算机名
- 搭建本地yum源
- MyCat - 测试篇
- MyCat - 测试篇
- MyCat - 测试篇
- explicit关键字的使用
- 【慕课笔记】2-1 File类常用API介绍
- android studio 开发 proxy 异常