链栈的实例应用

一.需求

利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法(R为二至九之间)。

二.分析

由计算机基础知识可知,把一个十进制整数x转换为任一种r进制数得到的是一个r进制的整数,假定为y,转换方法是逐次除基数r取余法。具体做法是:首先用十进制整数x除以基数r,得到的整余数是r进制数y的最低位y0,接着以x除以r的整数商作为被除数,用它除以r得到的整余数是y的次最低位y1,依次类推,直到商为0时得到的整余数是y的最高位ym,假定y共有m+1位。这样得到的y与x等值,y的按权展开式为:
y=y0+y1.r+y2.r2+…+ym.rm
假定一个十进制整数为3425,则把它转换为八进制数的过程如图5-3所示。

图 十进制整数3425转换为八进制数6541的过程
在这里插入图片描述

最后得到的八进制数为(6541)8,对应的十进制数为6×83+5×82+4×8+1=3425,即为被转换的十进制数,证明转换过程是正确的。
从十进制整数转换为r进制数的过程中,由低到高依次得到r进制数中的每一位数字,而输出时又需要由高到低依次输出每一位。所以此问题适合利用栈来解决

三.用到的知识

初始化栈、判栈为空、出栈、入栈、释放结点等运算。

四.程序伪代码

在这里插入图片描述
改善以上程序,使程序能够无限次进行数制转换直到用户要求退出,例如:“进行进制转换请按1,退出请按0”当用户输入0时,程序才退出。

五.代码实现

部分代码:

//链栈结点结构
typedef struct LSNode{
    ElemType data;//数据域
    struct LSNode *next; //指针域
}LSNode,*LStack;

//初始化
Status InitLSN(LStack &L){
    if(NULL==(L=(LStack)malloc(sizeof(LSNode))))
        return OVERFLOW;
    L->next=NULL;//头结点的next域为空
    return OK; }

//判断栈是否为空    
Status notnull(LStack L){
    //判断栈是不是空
    if(L==NULL)
    return OK;     //如果空,返回OK,即为1
    else
    return ERROR;
    }

//入栈
Status POP_LSN(LStack &L,ElemType e){
    LStack t;
    t = (LStack)malloc(sizeof(LSNode));  //开辟存储空间
    if(NULL == t) return OVERFLOW;//失败
    t->data = e;
    t->next = L;//指向原栈头
    L = t;
    return OK;        
    
    }
    
//出栈
Status PUSH_LSN(LStack &L,ElemType e){
    LStack t;

    if(NULL == L) return OVERFLOW; //空栈
    t = L;      //指向栈顶元素结点
    e = L->data;  //用e返回栈顶元素值
    printf("%d",e);
    L = L->next;    //删除栈顶元素结点
    free(t);    //释放结点
    return OK;        
    }

六.运行结果

求3425的8进制
完成进栈后的示意图
在这里插入图片描述
出栈(栈头结点6出栈)
在这里插入图片描述
输出的结果为6541
在这里插入图片描述
注:完成代码关注公众号回复100902得到。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值