/*
栈应用--数制转换
描述:输入任意的十进制正整数N,分别输出该整数N的二进制、八进制、十六进制的数
公式:N = (N div d) * d + N mod d (div表示整除,mod表示求余)
(1348)(十进制) = (2504)(八进制)= (544)(十六进制)= (10101000100)(二进制)
*/
/******************************************************************************/
//MyStack1.h 和MyStack1.cpp
#ifndef MYSTACK_H
#define MYSTACK_H
#include "Coordinate.h"
template <typename T>
class MyStack1
{
public:
MyStack1(int size);
~MyStack1();
bool stackEmpty();
bool stackFull();
void clearStack();
int stackLength();
bool push(T elem);
bool pop(T &elem);
void stackTraverse(bool isFromButtom);
private:
T *m_pBuffer;
int m_iSize;
int m_iTop;
};
#include "MyStack1.h"
#include <iostream>
using namespace std;
template <typename T>
MyStack1<T>::MyStack1(int size)
{
m_iSize = size;
m_pBuffer = new T[size];
m_iTop = 0;
}
template <typename T>
MyStack1<T>::~MyStack1()
{
delete []m_pBuffer;
}
template <typename T>
bool MyStack1<T>::stackEmpty()
{
if(0==m_iTop) //if(m_iTop == 0)
{
return true;
}
return false;
}
template <typename T>
bool MyStack1<T>::stackFull()
{
if(m_iTop == m_iSize) //>=
{
return true;
}
return false;
}
template <typename T>
void MyStack1<T>::clearStack()
{
m_iTop = 0;
}
template <typename T>
int MyStack1<T>::stackLength()
{
return m_iTop;
}
template <typename T>
bool MyStack1<T>::push(T elem)
{
if(stackFull())
{
return false;
}
m_pBuffer[m_iTop] = elem;
m_iTop++;
return true;
}
/*char MyStack::pop()
{
if(stackEmpty())
{
throw 1;
}
else
{
m_iTop--;
return m_pBuffer[m_iTop];
}
}*/
template <typename T>
bool MyStack1<T>::pop(T &elem)
{
if(stackEmpty())
{
return false;
}
m_iTop--;
elem = m_pBuffer[m_iTop];
return true;
}
template <typename T>
void MyStack1<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 // MYSTACK_H
//coordinate.h
#ifndef COORDINATE_H
#define COORDINATE_H
#include <iostream>
using namespace std;
class Coordinate
{
friend ostream &operator<<(ostream &out,Coordinate &coor);
public:
Coordinate(int x=0,int y=0);
void printCoordinate();
private:
int m_iX;
int m_iY;
};
#endif // COORDINATE_H
//coordinate.cpp
#include "Coordinate.h"
#include <iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
}
void Coordinate::printCoordinate()
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
ostream &operator<<(ostream &out,Coordinate &coor)
{
out<<"("<<coor.m_iX<<","<<coor.m_iY<<")"<<endl;
return out;
}
//main.cpp
#include <iostream>
#include "MyStack1.h"
#include "Coordinate.h"
using namespace std;
/******************************************************************************/
/*
栈应用--数制转换
描述:输入任意的十进制正整数N,分别输出该整数N的二进制、八进制、十六进制的数
公式:N = (N div d) * d + N mod d (div表示整除,mod表示求余)
(1348)(十进制) = (2504)(八进制)= (544)(十六进制)= (10101000100)(二进制)
*/
/******************************************************************************/
#define BINARY 2
#define OCTONARY 8
#define HEXADECIMAL 16
int menu()
{
//显示功能菜单
cout<<"请选择:"<<endl;
cout<<"1.二进制"<<endl;
cout<<"2.八进制"<<endl;
cout<<"3.十六进制"<<endl;
cout<<"请输入:";
int order = 0;
cin>>order;
return order;
}
int main()
{
char num[] = "0123456789ABCDEF";
int N;
int mod = 0;
int userOrder = 0;
int elem = 0;
MyStack1<int> *pStack = new MyStack1<int>(30);
while(userOrder!=4)
{
userOrder = menu();
switch(userOrder)
{
case 1:
cout<<"二进制转换:"<<endl;
cout<<"请输入:";
cin>>N;
while(N!=0)
{
mod = N % BINARY;
pStack->push(mod);
N = N/BINARY;
}
while(!pStack->stackEmpty())
{
pStack->pop(elem);
cout<<num[elem];
}
cout<<""<<endl;
break;
case 2:
cout<<"八进制转换:"<<endl;
cout<<"请输入:";
cin>>N;
while(N!=0)
{
mod = N % OCTONARY;
pStack->push(mod);
N = N/OCTONARY;
}
while(!pStack->stackEmpty())
{
pStack->pop(elem);
cout<<num[elem];
}
cout<<""<<endl;
break;
case 3:
cout<<"十六进制转换:"<<endl;
cout<<"请输入:";
cin>>N;
while(N!=0)
{
mod = N % HEXADECIMAL;
pStack->push(mod);
N = N/HEXADECIMAL;
}
while(!pStack->stackEmpty())
{
pStack->pop(elem);
cout<<num[elem];
}
cout<<""<<endl;
break;
}
}
delete pStack;
pStack = NULL;
return 0;
}