问题描述
目的:使用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之前的字符,加上对应的数字就是相关的数字
听着自己喜欢的音乐,码着代码不是一种享受吗?