[cpp]
/**
1.利用棧實現數制轉換,要求編程實現以下功能:
a. 編寫文件SqStack.h,定義棧類模板SqStack,以及其上的入棧、出棧、讀棧頂元素、判斷棧是否為空、清空棧及初始化等操作。
b. 編寫一個算法void MultiBaseOutput (int N,int B)實現利用棧將一個十進制整數N轉換為另一個等價的基為B的B進制數並輸出到屏幕。
如果B為16,能輸出A、B、C、D、E、F.例如十進制15應轉化為16進制F。
c. 編寫測試主函數。測試將一個十進制數30分別轉化為二進制數、八進制數及十六進制數。
*/
#include"Stack.h"
#include<iostream>
using namespace std;
void MultiBaseOutput (int N,int B)
{
SqStack<char>ST(100);
int temp,l;
char T;
char t = 'A';
while(N)
{
temp = N%B;
if(temp > 9)
{
l = temp -10;
ST.push_stack(char(t+(temp -10)));
}
else
{
ST.push_stack(char(temp+'0'));
}
N/=B;
}
while(!ST.Empty())
{
ST.pop_stack(T);
cout<<T<<" ";
}
}
int main()
{
int m =0,n=0;
cout<<"這是一個十進制數轉化為二進制數、八進制數及十六進制數的演示程序......................."<<endl;
cout<<"請輸入十進制數:";
cin>>m;
cout<<endl;
cout<<"請輸入你想將十進制轉換成的進制:";
cin>>n;
cout<<"十進制的:"<<m<<"轉換成"<<n<<"進制的數是:";
MultiBaseOutput (m,n);
cout<<endl;
return 0;
}
/**************************頭文件*************************/
//Stack.h
#include<iostream>
using namespace std;
template<class T>
class SqStack
{
public:
SqStack();
SqStack(int size);
//SqStack(const SqStack<T> ©);
//void operator=(const SqStack<T> ©);
virtual ~SqStack();
int Length()const;
bool Empty()const;
void Clear();
void traverse(void (*visit)(T &));
T & top_stac()const;//去棧頂元素
void push_stack(const T &);//入棧
void pop_stack(T &e);//出棧
void init(int size);
void top_stack(T &e)const;
bool full()
{ www.2cto.com
return m_top>= m_size;
}
protected:
int m_top;
int m_size;
T *m_base;
};
template<class T>
SqStack<T>::SqStack()
{
m_top=0;
m_size=100;
m_base=new T[m_size];
}
template<class T>
SqStack<T>::SqStack(int size)
{
m_top = 0;
m_base = new T[size];
m_size = size;
}
template<class T>
SqStack<T>::~SqStack()
{
if(m_base != NULL)
delete [] m_base;
}
template<class T>
int SqStack<T>::Length()const
{
return m_top;
}
template<class T>
bool SqStack<T>::Empty()const
{
return m_top==0;
}
template<class T>
void SqStack<T>::Clear()
{
m_top = 0;
}
template<class T>
void SqStack<T>::traverse(void (*visit) (T&))
{
for(int curposition=1;curposition<=length();curposition++)
{
(*visit)(m_base[curposition-1]);
}
}
template<class T>
void SqStack<T>::push_stack(const T &e)
{
if(full()) cout<<"stack is full";
else
{
m_base[m_top++]=e;
}
}
template<class T>
void SqStack<T>::top_stack(T &e)const
{
if(Empty())
cout<<"stack is empty";
else
{
e=m_base[m_top-1];
}
}
template<class T>
void SqStack<T>::pop_stack(T &e)
{
if(Empty())
cout<<"stack is empty";
else
{
e=m_base[m_top-1];
m_top--;
}
}