案例来自慕课网https://www.imooc.com/u/1349694/courses?sort=publish
十进制转换其他进制使用的是短除法:不停将原数除以进制,保留余数;然后商继续除以进制保留余数,直到商为0。再将余数从倒写即可得到进制转化。
如上图,对于十进制数1348,进行除8取余,将每次的余数 4 0 5 2 入栈,然后从栈顶开始打印。即可得到八进制数为2504。
接下来是代码部分:
通用栈(模板):
Mystack.h
//Mystack.h
#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
using namespace std;
template <typename T>
class MyStack
{
public:
MyStack(int size); //分配内存初始化栈空间,设定栈容量,栈顶
~MyStack(); //回收栈空间内存
bool stackEmpty(); //判断栈是否为空
bool stackFull(); //判断栈是否为满
void clearStack(); //清空栈
int stackLength(); //栈中元素的个数
bool push(T elem); //将元素压入栈中,栈顶上升
bool pop(T &elem); //将元素推出栈,栈顶下降
void stackTraverse(bool isFromButtom); //遍历栈中元素并输出
private:
int m_iTop; //栈顶,栈中元素个数
int m_iSize; //栈容量
T *m_pBuffer; //栈空间指针
};
template <typename T>
MyStack<T>::MyStack(int size)
{
m_iSize = size;
m_pBuffer = new T[size];
m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack()
{
delete[]m_pBuffer;
m_pBuffer = NULL;
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
if (m_iTop == 0)//if(0 == m_iTop)
{
return true;
}
else
{
return false;
}
}
template <typename T>
bool MyStack<T>::stackFull()
{
if (m_iTop == m_iSize)//>=
{
return true;
}
else
{
return false;
}
}
template <typename T>
void MyStack<T>::clearStack()
{
m_iTop = 0;//原栈中所有值无效
}
template <typename T>
int MyStack<T>::stackLength()
{
return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T elem)//放入栈顶
{
if (stackFull())
{
return false;
}
m_pBuffer[m_iTop] = elem;
//因为这里的coordinate是一个简单的复制。所以使用默认拷贝函数就可以了
m_iTop++;
return true;
}
template <typename T>
bool MyStack<T>::pop(T &elem)
{
if (stackEmpty())
{
return false;
}
m_iTop--;//因为入栈时做了++,使栈顶指向下一个空位置
elem = m_pBuffer[m_iTop];
return true;
}
//char MyStack::pop()
//{
// if (stackEmpty())
// {
// throw 1;
// }
// else
// {
// m_iTop--;
// return m_pBuffer[m_iTop];
// }
//}
template <typename T>
void MyStack<T>::stackTraverse(bool isFromButtom)
{
if (isFromButtom)
{
for (int i = 0; i < m_iTop; i++)
{
cout << m_pBuffer[i];
//m_pBuffer[i].printCoordinate();
}
}
else
{
for (int i = m_iTop - 1; i >= 0; i--)
{
cout << m_pBuffer[i];
//m_pBuffer[i].printCoordinate();
}
}
}
#endif
main.cpp
#include "MyStack.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
#define BINARY 2
#define OCTONARY 8
#define HEXADECIMAL 16
int main(void)
{
MyStack<int> *pStack = new MyStack<int>(30);
int N = 1348;
int mod = 0;
while (N !=0)
{
mod = N % BINARY;
pStack->push(mod);
N = N / BINARY;
}
pStack->stackTraverse(false);
pStack->clearStack();
cout << endl;
int M = 1348;
while (M !=0)
{
mod = M % OCTONARY;
pStack->push(mod);
M = M / OCTONARY;
}
pStack->stackTraverse(false);
cout << endl;
delete pStack;
pStack = NULL;
return 0;
}
上述代码可以用于二进制和8进制转换,但是由于十六进制除了0~9以外,还有“ABCDEF”需要输出,故需要对main.cpp修改(栈不需要修改)。
main.cpp
#include "MyStack.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
#define BINARY 2
#define OCTONARY 8
#define HEXADECIMAL 16
int main(void)
{
char num[] = "0123456789ABCDEF"; //若栈中出现了10 访问到的就是A
MyStack<char> *pStack = new MyStack<char>(30);
int N = 2018;
int mod = 0;
while (N !=0)
{
mod = N % HEXADECIMAL;
pStack->push(num[mod]);
N = N / HEXADECIMAL;
}
pStack->stackTraverse(false);
cout << endl;
delete pStack;
pStack = NULL;
return 0;
}