二進制轉換我們應該都不會陌生,在二進制,八進制,十六進制之間相互轉換在底層應用中,加密的算法中,還是需要我們掌握的。這次進制的轉換思想:輾轉相除法。將十進制的數字輾轉相除所需要轉換的數值直到結果爲0,將餘數倒過來排序即可得到所需要的與原來數值等值的某進制數值。
比如:100轉換爲2進制
100/2=50 餘數0
50/2=25 餘數0
25/2=12 餘數1
12/2=6 餘數0
6/2=3 餘數0
3/2=1 餘數1
1/2=0(結果爲0,結束相除) 餘數1
所以100用二進制表示就是:1100100
假如我們用數組來存儲所得到的餘數,那麼我們在進行結果輸出的時候將變鍀比較麻煩,因爲我們需要從數組存儲的餘數的最後一位開始輸出,要這樣做,我們就必須要知道我們的輾轉相除結果得到了多少位餘數,然後確定數組的下標,從該下標開始倒序輸出得到我們需要的結果。
這時,我們的棧的優良型就凸顯出來了,因爲我們的棧有元素後進先出的特點,那麼我們就只需把相除得到的餘數入棧,需要輸出結果時出棧就可以了,有木有覺得很方便咧
下面,就來一起完成吧!
棧的類模板:
#pragma once
#include<iostream>
using namespace std;
const int MaxSize = 100; //數組最大值
template<typename T>
class Stack {
public:
Stack(); //構造函數
~Stack(); //析構函數
bool Empty(); //判空
bool Full(); //判滿
bool EnStack(T x); //入棧
bool pop(); //出棧
bool GetTop(T &element); //獲取棧頂元素
private:
T data[MaxSize]; 順序棧的數組
int top;
};
template<typename T>
Stack<T>::Stack() {
top = -1;
}
template<typename T>
Stack<T>::~Stack() {
}
template<typename T>
bool Stack<T>::Empty() { //棧判空
return top == -1 ? true : false;
}
template<typename T>
bool Stack<T>::Full() { //棧判滿
return top == MaxSize - 1 ? true : false;
}
template<typename T>
bool Stack<T>::EnStack(T x) { //元素進棧
if (Full()) {
return false;
}
top++;
data[top] = x;
return true;
}
template<typename T>
bool Stack<T>::pop() { //元素出棧
if (Empty()) {
return false;
}
top--;
return true;
}
template<typename T>
bool Stack<T>::GetTop(T &element) { 查看棧頂元素
if (!Empty()) {
element = data[top];
return true;
}
return false;
}
二進制的轉換簡單法及簡單測試:
#include<iostream>
#include"Stack.h"
using namespace std;
/********棧的應用:進制的轉換 ***********/
/********原理:進制轉換的時候利用輾轉相除法,依次將取餘所得的數字
然後需要取出來的時候就從棧頂中一個個取出來
取出來的時候就剛好是順序了
********/
#define binary 2 //轉換成2進制
#define OCTONARY 8 //轉換成8進制
#define HEXADECTMAL 16 //轉換成16進制
int main() {
char num []= "0123456789ABCDEF"; //爲適應16進制的轉換
Stack<int> *p = new Stack<int>;
int N = 2017; //待轉換的數字
int mod = 0; //中間值
while (N!=0) { //餘數進棧
mod = N%binary; //獲得餘數
p->EnStack(mod); //餘數進棧
N = N / binary; //獲得下一次的被除數
}
int elem=0; //取出棧頂元素的中間值
while (!p->Empty()) {
p->GetTop(elem);
p->pop();
cout << num[elem];
}
delete p; //歸還空間
p = NULL; //歸還空間
return 0;
}
調用結果:(2017轉換位二進制)
就這樣,我們就利用棧實現了一個比數組實現方法簡單的二進制轉換的小例子。
有一點要說的是,這裏我們用的是順序棧來實現的,當然我們也可以用鏈棧來實現(看具體環境的需要吧)
以上所說的難免有錯漏,如有錯誤,還望不吝賜教,及時指出,謝謝