题目
1)问题描述:将从键盘输入的十进制数转换为N(如二进制,八进制,十六进制)进制数据。
2)要求:利用顺序栈实现数制转换问题
代码(c语言)
#include<stdio.h>
#include<stdlib.h>
//定义栈结构
typedef struct stack{
int num[50];
int tap;
}Stack;
//声明函数
void setTable(char* table);
void push(int number);
int pop();
int isEmpty();
//声明全局变量
Stack *stack;
void main(){
int number,radix; //number-被转换数 radix-转换进制
char table[36]; //定于数字字母匹配表
setTable(table);
printf("输入十进制数字:");
scanf("%d",&number);
printf("输入要转换的进制:");
scanf("%d",&radix);
stack = (Stack*)malloc(sizeof(Stack));
stack->tap=0;
//短除法
while(true){
push( number % radix);
number = number/radix;
if(number == 0)break;
}
printf("结果为:");
while(isEmpty() == 0){
printf("%c",table[pop()]);
}
putchar(10);//换行
}
//填充数字字母表
void setTable(char table[]){
int i = 0;
for(;i<10;i++){
table[i]='0'+i;
}
for(;i<37;i++){
table[i]='A'+i-10;
}
}
//入栈
void push(int number){
stack->num[stack->tap] = number;
stack->tap = stack->tap + 1;
}
//出栈
int pop(){
stack->tap = stack->tap - 1;
return stack->num[stack->tap];
}
//判断是否为空
int isEmpty(){
if(stack->tap == 0)return 1;
else return 0;
}
解析
1.题目思路
因为这是一道10进制转换N进制的题目,所以算法应该采用短除法
EG:十进制:10 转换成 二进制:1010
(第一次) 10%2 = 0 , 10/2 = 5
(第二次) 5 % 2 = 1 , 5/2 = 2
(第三次) 2 % 2 = 0 , 2/2 = 1
(第四次) 1 % 2 = 1 , 1/2 = 0
这时候发现规律了吧----短除算法计算的结果是从低位开始的(逆序的)。
那么,这样一种方式就可以利用栈的先进后出特性来得到正确的结果。
2.实现的方法
- 需要有一张表可以表示0-9 A-Z的字符
- 在循环中,每次短除的余数压入栈中,直到被除数为0为止。需要得到结果的时候,再一个一个地出栈并且去数字字母表找到匹配字符进行保存或者输出。
小结
在一些需要逆序操作的时候,可以考虑下栈或者是递归