十进制数和其他进制数之间通常有很多种转换方式,本文通过对堆栈的使用来实现十进制数和其他进制数之间的转换。
如下图所示是十进制转二进制:
从上图可以看出十进制数150经过转化后变成二进制数10010110,对结果进行分析可以看出当商为0时,把余数按照倒序组合之后就是转换的二进制数,通过分析发现这点和堆栈的后进先出的工作方式很想。可以想象,通过对给定的十进制数进行转换,把每次的余数压到堆栈中,等转换完毕就可以从堆栈中按照和刚才压入相反的顺序把余数读出来,这样正好就读到了转换后的进制数据。(注意:本应用以上篇博文为基础)
1、利用堆栈实现10进制数和任意其他进制的转换
函数的具体实现如下:
/* 利用堆栈实现进制转换
* dec : 原始的10进制数
* base : 目标进制
* s : 将转换后的内容存到堆栈中
* 返回值 : 0成功,其他失败
*/
int stack_radix_conversion(int dec, int base, Stack *s)
{
/* 判断堆栈是否存在 */
if(NULL == s)
{
return -1;
}
/* 初始化堆栈 */
stack_init(s);
/* 进行进制转换 */
while(dec)
{
if(stack_push(s, dec % base) == TRUE)
dec = dec / base;
else
return -1;
}
return 0;
}
里面需要调用堆栈的初始化函数stack_init(),这个函数来初始化堆栈的索引值为0,它的具体实现如下:
/* 初始化堆栈
* s : 要初始化的堆栈
*/
void stack_init(Stack *s)
{
s->top = 0;
}
2、按进制打印堆栈元素
如果是10进制以内,直接打印数值,如果是16进制则进行格式转换,具体实现如下:
/* 按进制打印堆栈元素的函数
* s : 要打印的堆栈
*/
void stack_print_radix(Stack *s)
{
int top = s->top;
printf("Stack : ");
while(top)
{
top = top - 1;
if(s->items[top] < 10)
printf("%d", s->items[top]);
else
{
printf("%c", s->items[top] - 10 + 'A');
}
}
printf("\n");
}
3、测试
通过控制台输入一个10机制树,然后依次把这个数转换成2进制,8进制,16进制,具体测试代码如下所示:
/* 程序的入口函数 */
int main()
{
int num;
int ret;
Stack *stack;
printf("Input a number : ");
scanf("%d", &num);
/* 创建一个堆栈 */
stack = stack_create();
if(NULL == stack)
{
printf("stack_create error!\n");
return -1;
}
printf("************************** 2 *************************\n");
/* 转换成二进制数 */
ret = stack_radix_conversion(num, 2, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 2 radix is error!\n");
return -1;
}
stack_print_radix(stack);
printf("************************** 8 *************************\n");
/* 转换成八进制数 */
ret = stack_radix_conversion(num, 8, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 8 radix is error!\n");
return -1;
}
stack_print_radix(stack);
printf("************************** 16 *************************\n");
/* 转换成十六进制数 */
ret = stack_radix_conversion(num, 16, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 16 radix is error!\n");
return -1;
}
stack_print_radix(stack);
/* 销毁一个堆栈 */
stack_destroy(&stack);
return 0;
}
编译并运行结果如下所示:
附录:本文实现的完整代码如下所示
#include <stdio.h>
#include <stdlib.h>
/* 定义堆栈的最大元素个数 */
#define MAX_ITEMS 20
/* 定义一个boolean型枚举类型 */
typedef enum{FALSE, TRUE} boolean;
/* 定义一个表示堆栈的结构体 */
typedef struct
{
int items[MAX_ITEMS];
int top;
} Stack;
/* 创建一个堆栈
* 返回值 : 返回创建的堆栈结构体地址
*/
Stack *stack_create(void)
{
Stack *s = malloc(sizeof(Stack)); // 分配一个堆栈空间
if(NULL == s) // 分配失败
{
return NULL;
}
else // 分配成功
{
s->top = 0;
return s;
}
}
/* 销毁一个堆栈
* s : 要销毁的堆栈的指针的指针
*/
void stack_destroy(Stack **s)
{
if(NULL != *s)
{
free(*s); // 执行销毁操作
}
}
/* 判断堆栈是否为空函数
* s : 表示要判断的堆栈
* 返回值: TRUE为空,FALSE为非空
*/
boolean stack_empty(Stack *s)
{
if(s->top == 0) return TRUE;
else return FALSE;
}
/* 判断堆栈是否为满函数
* s : 表示要判断的堆栈
* 返回值: TRUE表示满,FALSE表示非满
*/
boolean stack_full(Stack *s)
{
if(s->top == MAX_ITEMS) return TRUE;
else return FALSE;
}
/* 向栈顶插入一个元素
* s : 要插入的堆栈
* item : 要掺入的元素
* 返回值: TRUE成功,FALSE失败
*/
boolean stack_push(Stack *s, int item)
{
if(stack_full(s)) return FALSE;
else // 如果堆栈未满
{
// 先将元素压入堆栈,然后堆栈指针加一
s->items[s->top] = item;
s->top++;
return TRUE;
}
}
/* 将栈顶元素弹出
* s : 要操作的堆栈
* 返回值: 返回弹出的值,为0表示弹出失败
*/
int stack_pop(Stack *s)
{
if(stack_empty(s)) return 0;
else // 如果堆栈不为空
{
s->top--;
return s->items[s->top];
}
}
/* 获取栈顶元素
* s : 要操作的堆栈
* 返回值 : 返回堆栈元素值,为0表示获取失败
*/
int stack_get_top(Stack *s)
{
if(stack_empty(s)) return 0;
else // 如果不为空,返回堆栈的值
{
return s->items[s->top - 1];
}
}
/* 打印堆栈元素的函数
* s : 要打印的堆栈
*/
void stack_print(Stack *s)
{
int top = s->top;
printf("Stack : ");
while(top)
{
printf("%d ", s->items[--top]);
}
printf("\n");
}
/* 按进制打印堆栈元素的函数
* s : 要打印的堆栈
*/
void stack_print_radix(Stack *s)
{
int top = s->top;
printf("Stack : ");
while(top)
{
top = top - 1;
if(s->items[top] < 10)
printf("%d", s->items[top]);
else
{
printf("%c", s->items[top] - 10 + 'A');
}
}
printf("\n");
}
/* 初始化堆栈
* s : 要初始化的堆栈
*/
void stack_init(Stack *s)
{
s->top = 0;
}
/* 利用堆栈实现进制转换
* dec : 原始的10进制数
* base : 目标进制
* s : 将转换后的内容存到堆栈中
* 返回值 : 0成功,其他失败
*/
int stack_radix_conversion(int dec, int base, Stack *s)
{
/* 判断堆栈是否存在 */
if(NULL == s)
{
return -1;
}
/* 初始化堆栈 */
stack_init(s);
/* 进行进制转换 */
while(dec)
{
if(stack_push(s, dec % base) == TRUE)
dec = dec / base;
else
return -1;
}
return 0;
}
/* 程序的入口函数 */
int main()
{
int num;
int ret;
Stack *stack;
printf("Input a number : ");
scanf("%d", &num);
/* 创建一个堆栈 */
stack = stack_create();
if(NULL == stack)
{
printf("stack_create error!\n");
return -1;
}
printf("************************** 2 *************************\n");
/* 转换成二进制数 */
ret = stack_radix_conversion(num, 2, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 2 radix is error!\n");
return -1;
}
stack_print_radix(stack);
printf("************************** 8 *************************\n");
/* 转换成八进制数 */
ret = stack_radix_conversion(num, 8, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 8 radix is error!\n");
return -1;
}
stack_print_radix(stack);
printf("************************** 16 *************************\n");
/* 转换成十六进制数 */
ret = stack_radix_conversion(num, 16, stack);
if(ret != 0)
{
printf("stack_radix_conversion for 16 radix is error!\n");
return -1;
}
stack_print_radix(stack);
/* 销毁一个堆栈 */
stack_destroy(&stack);
return 0;
}