顺序栈ADT模板简单应用算法设计:进制转换

83 篇文章 5 订阅
67 篇文章 2 订阅

问题描述

目的:使用C++模板设计顺序栈的抽象数据类型(ADT)。并在此基础上,使用顺序栈ADT的基本操作,设计并实现简单应用的算法设计。

内容:(1)请参照顺序表的ADT模板,设计顺序栈的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的顺序表ADT原型文件,自行设计顺序栈的ADT。)

(2)ADT的简单应用:使用该ADT设计并实现若干应用顺序栈的算法设计。

应用2:要求设计一个算法,使用顺序栈,设计并实现完成如下功能的算法:对于输入的任意一个非负十进制整数,屏幕输出与其等值的指定进制数。

参考函数原型:

template

void Conversion(SqStack &S, int data, int format);

(形参data的含义:输入的任意一个非负十进制整数;format的含义:指定进制,如16进制即为16)

注意:若指定进制大于十进制,请注意对应进制字符的转换,如16进制的F对应十进制的15。

输入说明

第一行:任意一个非负十进制整数

第二行:指定进制

输出说明

第一行:指定进制的转换结果

输入范例
159
16
输出范例
9F
问题分析
问题重点
  • 使用栈实现
  • 非负的十进制整数
  • 若进制大于10,注意字符转换
思路分析
  • 从最基本的二进制出发,自然而然地想到短除法,使用栈保存余数,然后使用栈将输出保存地数字

  • 如下图
    在这里插入图片描述

  • 基本思路就是将余数依次压入栈中,然后正常出栈,即为最终地结果

  • 当然针对大于9的,要采用相关的字符进行替代

找个故事比喻一下

前提:天太热,糖放到一起会融合的

  • 将两个糖放到一块,会融合成一块
  • 所以第一天分在一起的几块糖,一会就变成了一块糖
  • 这孩子有强迫症,每天只能吃特定数量的糖,必须按数量分好

在这里插入图片描述

  • 写出小孩吃糖的顺序,按照从最后到第一天的顺序就是:111,刚好七颗糖
伪代码
void Conversion(SqStack<ElemType> &S, int data, int format)
{
    //定义相关的数字
    int temp = data;
    int remainder = 0;
    char num2;
   
    //定义分糖的过程
    while(temp != 0)
    {

        //将糖进行分块,看看剩多少不够一天的
        remainder = temp % format;
        temp = temp / format;

        //吃糖
        //针对数字,直接将对应的九个数字转成字符型存档
        if(remainder < 10)
        {
            num2 = (char)('/' + 1 + remainder);
            S.push(num2);
        }
        else
        {
            //如果大于9,那就计算关于九的差值,加上对应的A即可获得相关的值
            num2 = (char)('A'+remainder - 10);
            S.push(num2);
        }
    }
    //输出小孩吃糖的顺序
    while(!S.StackisEmpty())
    {
        S.pop(num2);
        cout<<num2;
    }
}
事故现场
第一次提交
  • 不是睁着眼睛说瞎话,第一遍不算,我忘记将测试语句删了
    在这里插入图片描述
  • 这次没有事故
分析与总结
  • 关于char、string和int之间的相互转换不是很流畅,花了很多时间。这里采用了ASCII表进行转换,将初始字符加上对应的余数,将之进行char型的强转即可

在这里插入图片描述
在这里插入图片描述

  • ‘/’表示0之前的字符,加上对应的数字就是相关的数字

听着自己喜欢的音乐,码着代码不是一种享受吗?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值