任务描述
本关任务:利用栈将一个十进制整数N转换成其它进制数。
相关知识
为了完成本关任务,你需要掌握:1. 顺序栈的类型定义,2.顺序栈的操作。
顺序栈的类型定义
#define MAXSIZE 100 //最大长度
typedef int ElemType; // 栈元素的数据类型
typedef struct {
ElemType *elem; //指向数据元素的起始地址
int top; //栈顶元素的下标
}SqStack;
顺序栈的操作
顺序栈的初始化:构造一个空栈。具体操作函数定义如下:
void SS_Initiate(SqStack &S)
判断顺序栈是否为空:若为空栈,则返回true,否则返回false。该操作函数具体定义如下:
bool SS_IsEmpty(SqStack S)
判断顺序栈是否已满:若顺序栈达到最大长度,则返回 true,否则返回false。该操作函数具体定义如下:
bool SS_IsFull(SqStack S))
入栈:将元素e入栈,使e成为新的栈顶元素。该操作函数具体定义如下:
void SS_Push(SqStack &S, ElemType e)
出栈:删除S的栈顶元素,用e返回其值。该操作函数具体定义如下:
void SS_Pop(SqStack &S, ElemType &e)
数制转换:利用栈将十进制整数N转换成r进制数。该操作函数具体定义如下:
void Conversion(int N, int r)
编程要求
根据提示,在右侧编辑器中补充代码,完成Conversion函数,以实现十进制数转换成其它进制数。具体要求如下:
* Conversion: 利用栈将十进制整数N转换成r进制数。
测试说明
平台会对你编写的代码进行评测,测试文件为step3/Main.cpp,可在右侧文件夹中进行查看:
测试输入:
687
2
预期输出:
1010101111
测试输入:
687
8
预期输出:
1257
测试输入:
687
16
预期输出:
2AF
开始你的任务吧,祝你成功!
/*************************************************************
利用栈实现数制转换 实现文件
更新于2020年4月27日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"
void SS_Initiate(SqStack &S)
// 顺序栈的初始化,即构造一个空的顺序栈
{
S.elem = (ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
S.top=-1;
}
bool SS_IsEmpty(SqStack S)
// 判断顺序栈是否为空
{
return S.top==-1;
}
bool SS_IsFull(SqStack S)
// 判断顺序栈是否为满
{
return S.top==MAXSIZE-1;
}
void SS_Push(SqStack &S, ElemType e)
// 插入元素e为新的栈顶元素
{
if(SS_IsFull(S)) return;//栈满
S.top++; S.elem[S.top]=e;
}
void SS_Pop(SqStack &S, ElemType &e)
// 删除S的栈顶元素,用e返回其值
{
if(SS_IsEmpty(S)) return; //栈空
e=S.elem[S.top]; S.top--;
}
void Conversion(int N, int r)
// 利用栈将十进制整数N转换成r进制数(如:二、八、十六进制)
// 输出转换的结果
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
SqStack S;
SS_Initiate(S);
if (N == 0) {
printf("0");
return;
}
while (N) {
SS_Push(S, N % r);
N = N / r;
}
int e;
while (!SS_IsEmpty(S)) {
SS_Pop(S, e);
if (e >= 10) {
printf("%c", e - 10 + 'A'); //转换为16进制需要将数字转化为字符
} else {
printf("%d", e);
}
}
/********** End **********/
}