头歌 第3关:利用栈实现数制转换

任务描述
本关任务:利用栈将一个十进制整数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 **********/
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值