題目
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爲止。需要得到結果的時候,再一個一個地出棧並且去數字字母表找到匹配字符進行保存或者輸出。
小結
在一些需要逆序操作的時候,可以考慮下棧或者是遞歸