PTA(栈和队列)1-3 用链栈实现将非负的十进制数转换为指定的进制数
PTA(栈和队列)1-3 用链栈实现将非负的十进制数转换为指定的进制数
zhangzhang1-3 用链栈实现将非负的十进制数转换为指定的进制数
分数 3
作者 CUIT通信DS课程组
单位 成都信息工程大学
利用链序栈将输入的非负的十进制数N转换为指定的d(二、八或十六)进制数。
链栈的定义如下:
1 | typedef struct SNode |
函数接口定义:
1 | int DecimalConvert(LinkStack s, int dec, int scale); |
函数参数说明:形参–s、dec、scale,其中,s是存放转换后的scale进制数的各位数字,dec 主函数输入的待转换的十进制数,scale是指定的数制(只能是2、8或16)。 函数返回值:1,表示函数执行完成;0,表示函数未成功执行。
裁判测试程序样例:
1 |
|
输入样例:
1 | 20 2 |
输出样例:
1 | 十进制数:20,转换为:2进制数,结果为:10100 |
输入样例:
1 | 20 8 |
输出样例:
1 | 十进制数:20,转换为:8进制数,结果为:24 |
输入样例:
1 | 20 16 |
输出样例:
1 | 十进制数:20,转换为:16进制数,结果为:14 |
此题用的链栈存储结构,带头节点(因为我看到初始化链栈的时候分配了)
答案
1 | int DecimalConvert(LinkStack s, int dec, int scale) { |
一、unsigned是什么
unsigned是一个类型修饰符(关键字),用于修饰整数类型,表明该类型的变量只存储非负整数(即取值范围从 0 开始),没有符号位当
unsigned单独使用时(如unsigned dec, scale;),默认修饰的是int类型,等价于unsigned int dec, scale;,表示dec和scale是 “无符号整数” 变量。
二、*top == NULL为啥用*top
1 | typedef struct SNode |
- 为什么这里用*top?top不是指针吗,不应该直接top指向下个一个结点吗,直接top = …
1.核心原因:top 是 “指针的指针”(LinkStack* 类型)
在函数 InitLinkStack(LinkStack* top) 中:
LinkStack是struct SNode*的 typedef 别名(即LinkStack本身就是一个指针类型,指向SNode结构体)。- 因此
LinkStack* top等价于struct SNode**top,表示top是一个 “指针的指针”—— 它指向的是一个LinkStack类型的指针(即struct SNode*类型的指针)。
2.为什么需要 “指针的指针”?
函数的目标是 初始化外部的栈顶指针(即让外部的 LinkStack 变量指向新分配的节点)。但 C 语言中函数参数是 值传递:如果直接传递 LinkStack top(一级指针),函数内部的 top 只是外部指针的一份拷贝,修用 *top 的作用:修改外部指针的值
top 是 “指针的指针”(指向外部的 LinkStack 指针),通过 *top 可以
3.间接访问并修改外部指针本身的值:
*top = (LinkStack)malloc(...):给外部的栈顶指针分配内存,让它指向新节点。(*top)->next = NULL:通过外部指针访问新节点,初始化其next为NULL(表示栈为空)。
在c++中可以用LinkStack &top引用写
三、int LinkStackPop(LinkStack top, DataType* e)
LinkStack是struct SNode*的别名,即top是一个 一级指针参数(函数调用时传递的是外部栈顶指针的拷贝)。- 对于一级指针参数:
- 可以修改指针指向的内存内容(例如
top->next = p):因为top拷贝了外部指针的地址,通过top能访问到同一块内存(栈顶节点),所以对top->next的修改会直接影响外部的链表结构(这正是压栈需要的操作)。
- 可以修改指针指向的内存内容(例如



