二进制转换我们应该都不会陌生,在二进制,八进制,十六进制之间相互转换在底层应用中,加密的算法中,还是需要我们掌握的。这次进制的转换思想:辗转相除法。将十进制的数字辗转相除所需要转换的数值直到结果为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转换位二进制)
就这样,我们就利用栈实现了一个比数组实现方法简单的二进制转换的小例子。
有一点要说的是,这里我们用的是顺序栈来实现的,当然我们也可以用链栈来实现(看具体环境的需要吧)
以上所说的难免有错漏,如有错误,还望不吝赐教,及时指出,谢谢