栈的应用篇(数制转换)

/******************************************************************************/
/*
    栈应用--数制转换
    描述:输入任意的十进制正整数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值