任务描述
本关任务:使用栈基本操作实现数的进制转换。
以十进制数转换为二进制数为例,规则(只考虑整数)
采用除2取余法。如:
如何存储和输出二进制数
从数制转换示例可以看出,十进制数转换成相应二进制数可使用栈存放,再依次弹出栈顶元素输出,即可得到相应二进制结果。
编程要求
在右侧编辑器补充代码,完成数的进制转换。
测试说明
平台会对你编写的代码进行测试:
测试输入:
173 2
预期输出:
10101101
测试输入:
10 8
预期输出:
12
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
/*此处是顺序栈数据结构定义*/
typedef int DataType;
struct seqStack
{//有3个数据成员
int MAXNUM;//用于记录顺序栈中能存放的最大元素个数的 整型 MAXNUM
int top;//用于存放顺序栈的栈顶位置,初始化为0或-1 均可 整型 curNum
DataType *element;//用于存放顺序栈数据元素的连续空间的起始地址
};
typedef struct seqStack *PseqStack;
//第一关
PseqStack createNullStack_seq(int m)
{//此处填写代码,创建一个空的顺序栈,能存放的最大元素个数为 m,栈顶top设置为0
//若m=0,则返回NULL
if(m == 0) return NULL;
else{
PseqStack nullStack_seq = (PseqStack)malloc(sizeof(struct seqStack));
if(nullStack_seq){//顺序栈创建成功时
nullStack_seq->element = (DataType*)malloc(sizeof(DataType)*m);
if(nullStack_seq->element){//顺序栈元素空间创建成功时
nullStack_seq->MAXNUM = m;
nullStack_seq->top = 0;
}
else free(nullStack_seq);
}
return nullStack_seq;
}
}
//第二关
int isNullStack_seq(PseqStack L)
{
//判断顺序栈是否为空,若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1
if(L == NULL) return -1;
else{
if(L->top == 0) return 1;
else return 0;
}
}
//第三关
int isFullStack_seq(PseqStack L)
{
//判断顺序栈是否已满,若已满,返回值为1,否则返回值为0
if(L){
if(L->top == L->MAXNUM) return 1;
else return 0;
}
}
//第四关
int push_seq(PseqStack L ,DataType x)
{//在顺序栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1
if(isFullStack_seq(L)) return 0;
else{
L->element[L->top+1] = x;
L->top++;
return 1;
}
}
//第五关
DataType pop_seq(PseqStack L)
{//弹栈并返回删除元素,若栈为空,则返回-1
int m;
if(isNullStack_seq(L)) return -1;
else{
m = L->element[L->top];
L->top = L->top - 1;
return m;
}
}
//第六关
DataType top_seq(PseqStack L)
{// 取栈顶元素返回,若栈为空,则返回-1
if(isNullStack_seq(L)) return -1;
else{
return L->element[L->top];
}
}
//销毁顺序栈,释放栈所占存储空间
int destroystack_seq(PseqStack L)
{
//返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0
if(L) return 0;
else{
int m;
m = L->top;
free(L->element);
return m;
}
}
//第七关
//使用已实现的栈操作,实现数制转换
void print(PseqStack L)
{
//逐个弹出栈L中的数据元素并输出,输出数据间不需要任何间隔符号
while(!isNullStack_seq(L)){
printf("%d", pop_seq(L));
}
}
void convert(int data , int k)
{
//利用栈实现将data转换为k进制,k可能是2,8,16. 在本函数内实现转换并调用print函数输出转换后的结果
//十六进制时输出 A ,B ,C, D,E,F 使用大写字母
PseqStack head = createNullStack_seq(10);
while(data!=0){
push_seq(head, data % k);
data = data / k;
}
if(k==2 || k==8)
print(head);
else{
while(!isNullStack_seq(head)){
switch(head->element[head->top]){
case 10:printf("%c", 'A');break;
case 11:printf("%c", 'B');break;
case 12:printf("%c", 'C');break;
case 13:printf("%c", 'D');break;
case 14:printf("%c", 'E');break;
case 15:printf("%c", 'F');break;
default:printf("%d",head->element[head->top]);
}
pop_seq(head);
}
}
}