用栈的思想实现数制转换(十进制->八进制)
2016-08-11 07:15
225 查看
十进制和其他d进制数的转换是计算机实现计算的基本问题,其中一个简单算法基于下列原理:
N=(N div d)*d+N mod d(div 为整除运算,mod为求余运算)
下列代码用栈的思想(先进后出)实现数制转换,不足之处是:
仅仅是用代码实现功能;
代码没有优化;
中间“注释”太多。
参考代码:
运行输出:
N=(N div d)*d+N mod d(div 为整除运算,mod为求余运算)
下列代码用栈的思想(先进后出)实现数制转换,不足之处是:
仅仅是用代码实现功能;
代码没有优化;
中间“注释”太多。
参考代码:
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define NO 0 #define ADD_SIZE 20 #define INIT_SIZE 10 typedef int Status; typedef struct /*类型定义,定义了一个SqStack类型,可以用它来定义一个变量*/ { int *top; int *base; int stacksize; }SqStack; Status InitStack(SqStack *S) { /*分配内存,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。*/ S->base=(int *)malloc(INIT_SIZE*sizeof(int)); if(!S->base) printf("ERROR!\n"); S->top=S->base; S->stacksize=INIT_SIZE; return OK; } Status Push(SqStack *S,int e) { if(S->top-S->base>=S->stacksize)/*两个指针的差是中间元素的个数*/ { S->base=(int *)malloc((INIT_SIZE+ADD_SIZE)*sizeof(int)); if(!S->base) printf("ERROR!\n"); S->top=S->base+S->stacksize; S->stacksize+=ADD_SIZE; } *S->top++=e;//先把e给当前指针所指的位置,然后指针+1 return OK; } Status Pop(SqStack *S)//直接在原结构体上操作 { int e; e=*--S->top;//指针先减1,再把它的值赋给e return e; } int main() { int N;//输入 int m;//N%8 m先入栈,最后出栈 int out_stack_value; SqStack S; InitStack(&S); scanf("%d",&N); while(N!=0) { m=N%8;//余数,进栈 Push(&S,m); N=N/8; } while(S.top-S.base>0) { out_stack_value=Pop(&S);//出栈值 printf("%d",out_stack_value);//传递的是原结构体的地址 } printf("\n"); return 0; }
运行输出:
相关文章推荐
- C语言实现十进制转八进制
- 利用hashtable模拟实现权限验证(同map思想-->只能有一个用户名,可重复密码)以及增删查改操作
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
- 数制转换(十进制、二进制、八进制、十六进制)
- OC学习--<猜拳游戏> 之 通过面向对象思想实现 2.0版本
- 汇编-&gt;十进制到十六进制数转换的程序实现
- 用堆栈实现四则运算(不带括号)、十进制转八进制
- 【数据结构】 栈实现 十进制到八进制的转化
- 递归和while循环实现十进制转八进制
- 进制转换 十进制转化为八进制 通过栈实现
- PHP实现各进制间的转换 十进制与二进制、八进制、十六进制间的互换
- 数据结构(C语言版)数制转换,用栈来实现十进制换成八进制的数
- 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换
- 关于使用查表法实现十进制到二进制,八进制,十六进制的转换
- C++实现二进制、八进制、十进制、十六进制的相互转换
- 二进制、八进制、十进制、十六进制之间转换 <转>
- 二进制、八进制、十进制、十六进制之间转换 &lt;转&gt;
- 顺序栈实现十进制和八进制之间的转换
- OC学习--<猜拳游戏> 之 通过面向对象思想实现
- 进制转换器(用顺序栈实现)(可实现简单的二进制或八进制或十进制的转换)