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

十进制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);
}

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

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值