用 C++ 和栈实现数制转换和进制转换

用 C++ 和栈实现数制转换和进制转换

/*
用 C++ 和 栈 实现数制转换 和 进制转换
*/

#includemalloc.h //调用 malloc 和 realloc,不可或缺
#includeiostream //把这几个   换成 < >
#includestdlib.h //
#includestring.h //
using namespace std;

#define STACK_INIT_SIZE 100 //初始栈的大小
#define STACKINCREMENT 10 //栈的增量大小

typedef int SElemType;

//定义栈结构
typedef struct
{
    SElemType *top;
    SElemType *base;
    int stacksize;
}SqStack;

//建立栈
void InitStack(SqStack &S) {
    S.base = (SElemType *) malloc (STACK_INIT_SIZE * sizeof(SElemType)); // <=> S.base = (SElemType *) new int(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base)
    {
        cout << endl << 分配储存空间失败! << endl;//Allocate space failure!
    }
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}

//插入元素e
void Push(SqStack &S, SElemType e)
{
    if (S.top - S.base >= S.stacksize) //如果栈满,追加储存空间
    {
        S.base = (SElemType )realloc(S.base, (S.stacksize +STACKINCREMENT)sizeof(SElemType));
    if (!S.base)
        cout << 追加存储空间失败! << endl;
    S.top = S.base + S.stacksize; //重新初始化S.top的位置
    S.stacksize += STACKINCREMENT; //栈长度加上增加的长度
    }
    *S.top++ = e; //cout << endl << 插入成功! << endl;
}

//打印栈,和书上的Pop功能类似但实现方法更简单
void PrintStack(SqStack &S)
{
    SElemType *p;
    for (p = S.top-1; p >=S.base; --p) //从栈顶向下打印元素
    {
        cout << *p;
    }
}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回0. 否则返回-1
void Pop(SqStack &S, SElemType &e, SElemType &m)
{
    if (S.top == S.base)
    m = -1;
    e = * --S.top;
    m = 0;
}

// 判断S是否为空栈
int StackEmpty(SqStack &S)
{
    if (S.top == S.base)
        return 1;
    else
        return 0;
}

//若栈不空,则用e返回S的栈顶元素,并返回1.否则返回0
void GetTop(SqStack &S, SElemType &e, SElemType &m)
{
    if (S.top == S.base)
        m = 0;
    e = *(S.top -1);
    m = 1;
}

//进制转换模块
void JIN()
{
    SqStack S;
    int N,NT,r,e,m;
    cout << ***** 进制*转换 ***** << endl;

//建栈,并初始化 I
    InitStack(S); 
    cout << 要转换的十进制数: ; 
    cin >> N; 
    cout << 要转换成的进制:; 
    cin >> r; 
    NT = N;

//取余数入栈 
    while (N) 
    { 
        Push(S, N % r); 
        N = N / r; 
    }

    cout << NT << 的 << r << 进制数为: ;
/*
//打印栈
PrintStack(S);
这个方法比下面Pop更简单
*/
    while (!StackEmpty(S))
    {
        Pop(S,e,m);
        printf(%d,e);
    }

    cout << endl;
}

//回文数判断
void HUI()
{
    cout << ***** 回文数判断 ****** << endl;
    SqStack S;
    char t[100];
    InitStack(S);
    int m,d,n,o,h,e,len;
    cout << 请输入一段数字 << endl;
    cin >> t;
    len = strlen(t);
    if (len % 2 == 0) //输入个数为偶数
    {
        for (m = 1 ; m < ( len / 2); m++)
        {
            Push(S, t[m]);
        }

        for (m ; m < len - 1; m++)
        {   
            Pop(S,n,o);
            if ( t[m] != n)
            {
                 cout << 该数不是回文数! << endl;
                exit(1);
            }
        }
        m++;    
        if (m == len)//???????????
            cout << 该数是回文数! << endl;
    }
    else        //输入个数为奇数
    {
        for (m = 1; m < len / 2; m++)
        {   
            Push(S, t[m]);
        }
        m++;                                  //跳过中间项目
        for (m ; m < len - 1; m++)
        {   
            Pop(S,n,o);
            if (t[m] != n)
            {
                cout << 该数不是回文数! << endl; 
                exit(1);
            }
        }   
        m++;
        if( m == len )
            cout << 该数是回文数! << endl;
    }       
}

int main()
{
        int i = 0;
        while( i != 3)
        {
                cout << ****** 菜单 ****** << endl;
                cout <<  1.进制转换\n 2.回文数判断\n 3.退出\n 请选择:;
                cin >> i;
                cout << ****************** << endl << endl;
                if (i  == 1)
                JIN();
                else if ( i == 2)
                       HUI();
               cout << endl << endl;
       }
       return 0;
}
除非特别说明,本博客所有作品均采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明转自-https://www.emperinter.info/2018/10/17/%e7%94%a8-c-%e5%92%8c%e6%a0%88%e5%ae%9e%e7%8e%b0%e6%95%b0%e5%88%b6%e8%bd%ac%e6%8d%a2%e5%92%8c%e8%bf%9b%e5%88%b6%e8%bd%ac%e6%8d%a2/

Leave a Comment