C++堆栈应用(一):数制转换

让人想犯罪 __ 提交于 2020-02-06 07:01:50

十进制N和其它进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:
N=(n div d)*d+n mod d
( 其中:div为整除运算,mod为求余运算)
例如 (1348)10=(2504)8,其运算过程如下:
在这里插入图片描述
不难发现,最后得到的余数2在新的八进制数的最高位(第一位),而最先得到的余数4在新的八进制数的最低位(最后一位)。而我们一般读数是从最高位读起,所以比较简便的做法是将每次取余(mod)得到的余数存储在具有后进先出的特点的结构中,这样只需依次读出余数,便得到了相应的新数制的数。而堆栈刚好具有这样的特点。
使用堆栈进行数制转换的算法如下:

void Conversion(int n,int base) 
{
    LinkStack *s;
    s=InitStack();
    int remainder;
    while(n!=0){ //进行求模运算,直到n为0时退出循环
        remainder=n%base;
        Push(s,remainder);
        n=n/base;
    }
    while(s->next!=NULL)  //依次弹出栈顶的元素,最终形成的数即为所求进制数
        cout<<Pop(s);
    cout<<endl;
}

1.使用链栈实现数制转换的完整程序

#include <iostream>
using namespace std;
/*定义链栈的结点类型*/
typedef struct Node
{
    int data;
    Node *next;
}LinkStack;


int main()
{
    LinkStack *InitStack();
    void Push(LinkStack *s,int x);
    int Pop(LinkStack *s);
    void Conversion(int n,int base);

    int n,base;
    cout<<"请输入需要转换的十进制数:";
    cin>>n;
    cout<<"请输入新数制的基数:";
    cin>>base;
    Conversion(n,base);
    return 0;
}

/*置空栈:初始化链栈*/
LinkStack *InitStack()
{
    LinkStack *s;
    s=new LinkStack;
    s->next=NULL;
    return(s);
}

/*入栈,在栈顶读入数值x*/
void Push(LinkStack *s,int x)
{
    LinkStack *p;
    p=new LinkStack;
    p->data=x;
    p->next=s->next;
    s->next=p;
}

/*出栈:弹出栈顶元素*/
int Pop(LinkStack *s)
{
    LinkStack *q;
    int top;
    if(s->next==NULL){
        cout<<"栈空"<<endl;
        return 0;
    }
    else{
        q=s->next;
        top=q->data;
        s->next=q->next;
        delete q;
        return(top);
    }
}

/*数制转换*/
void Conversion(int n,int base)
{
    LinkStack *s;
    s=InitStack();
    int remainder;
    while(n!=0){ //进行求模运算,直到n为0时退出循环
        remainder=n%base;
        Push(s,remainder);
        n=n/base;
    }
    while(s->next!=NULL)  //依次弹出栈顶的元素,最终形成的数即为所求进制数
        cout<<Pop(s);
    cout<<endl;
}

2.使用顺序栈实现数制转换的完整程序

#include <iostream>
using namespace std;
#define MaxSize 100
/*定义顺序栈的结点类型*/
struct SeqStack
{
    int data[MaxSize];
    int top;
};

int main()
{
    SeqStack *InitStack();
    void Push(SeqStack *s,int x);
    int Pop(SeqStack *s);
    void Conversion(int n,int base);

    int n,base;
    cout<<"请输入需要转换的十进制数:";
    cin>>n;
    cout<<"请输入新数制的基数:";
    cin>>base;
    Conversion(n,base);
    return 0;
}

/*置空栈:初始化顺序栈*/
void InitStack(SeqStack *s)
{
    s->top=-1;
}

/*入栈,在栈顶读入数值x*/
void Push(SeqStack *s,int x)
{
    if(s->top==MaxSize-1)
        cout<<"栈已满"<<endl;
    else{
        s->data[++s->top]=x;
    }
}

/*出栈:弹出栈顶元素*/
int Pop(SeqStack *s)
{
    int x;
    if(s->top==-1){
        cout<<"栈已空"<<endl;
        return 0;
    }
    else{
        x=s->data[s->top];
        s->top--;
        return(x);
    }
}

/*数制转换*/
void Conversion(int n,int base)
{
    SeqStack *s,Stack;
    s=&Stack;
    InitStack(s);
    int remainder;
    while(n!=0){ //进行求模运算,直到n为0时退出循环
        remainder=n%base;
        Push(s,remainder);
        n=n/base;
    }
    while(s->top!=-1)  //依次弹出栈顶的元素,最终形成的数即为所求进制数
        cout<<Pop(s);
}

注意:
在用顺序栈实现数制转换时,当我如下设置InitStack()函数和Conversion()函数,程序不能正常运行。

/*置空栈:初始化顺序栈*/
SeqStack *InitStack()
{
    SeqStack *s,Stack;
    s=&Stack;
    s->top=-1;
    return(s);
}
/*数制转换*/
void Conversion(int n,int base)
{
    SeqStack *s;
    s=InitStack();
    int remainder;
    while(n!=0){ //进行求模运算,直到n为0时退出循环
        remainder=n%base;
        Push(s,remainder);
        n=n/base;
    }
    while(s->top!=-1)  //依次弹出栈顶的元素,最终形成的数即为所求进制数
        cout<<Pop(s);
}

在这里插入图片描述
在这里插入图片描述
网上找原因,也有人在使用顺序栈时遇到了这样的问题,看解答,好像跟栈的初始化有关,具体原因暂时还不能完全弄清楚,先将这个问题记在这里。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!