考研数据结构之栈(2.5)——练习题之实现数制转换(C表示)

题目

将十进制数转换成其他进制的数。

分析

首先要知道常规是怎么求的。

核心代码如下:

/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */ 
void conversion(int N,int S) {
	/* 初始化栈 */
	SqStack stack;
	initStack(stack);// 初始化顺序栈
	int x;// 用来存储出栈的元素值
	/* 入栈 */
	while(N!=0) { // 循环
		push(stack,N%S);// 将余数压入栈中
		N=N/S;// 继续求商
	}
	/* 出栈 */
	while(stack.top!=-1) { // 当栈不为空时不断循环
		pop(stack,x);// 将栈的一个个数出栈形成需要的结果
		printf("%d",x);// 打印出栈元素
	}
}

全部代码:

#include <stdio.h>

#define maxSize 20

typedef struct {
	int data[maxSize];// 存放栈中元素,maxSize是已经定义好的常量
	int top;// 栈顶指针
} SqStack; // 顺序栈类型定义

/* 初始化顺序栈 */
/* &st指的是要操作的顺序栈 */
void initStack(SqStack &st) {
	st.top=-1; // 只需将栈顶指针设置为-1,本栈中将top=-1规定为栈空状态
}

/* 判断栈空 */
/* st指的是要进行判空的顺序栈 */
int isEmpty(SqStack st) {
	// 栈为空的时候返回1,否则返回0
	if(st.top==-1) { // 判空的条件是栈顶指针是否等于-1
		return 1;
	} else {
		return 0;
	}
}

/* 判断栈满 */
/* st指的是要进行判满的顺序栈 */
int isFull(SqStack st) {
	// 如果栈顶指针等于maxSize-1那么栈满,否则栈空
	if(st.top==maxSize-1) { // maxSize是栈中最大元素个数,已经定义
		return 1;// 栈满返回1
	} else {
		return 0;// 栈空返回0
	}
}

/* 进栈 */
/* &st指的是要操作的栈;x指的是要进栈的数据 */
int push(SqStack &st,int x) {
	/* 进栈首先要判断栈是否栈满,如果满栈则不能进栈 */
	if(isFull(st)==1) {
		return 0;// 如果栈满返回0,表示不能进栈
	} else {
		// 注意:++top和top++在这里的作用是一样的,都可以使用,如果是a=++top和a=top++,那么两个a的值是不一样的,最后top的值还是一样
		++st.top;// 先移动指针,再进栈
		st.data[st.top]=x;
		return 1;// 进栈成功返回1
	}
}

/* 出栈 */
/* &st指的是要操作的栈;&x指的是要出栈的数据 */
int pop(SqStack &st,int &x) {
	/* 出栈之前要判断栈是否为空 */
	if(isEmpty(st)==1) {// 1表示栈空,0表示非空
		return 0;// 如果栈空,不能出栈,返回0
	} else {
		x=st.data[st.top];// 先取出元素,再出栈
		--st.top;
		return 1;// 出栈成功返回1
	}
}

/* 打印栈,从左到右表示栈底到栈顶 */
/* stack表示要被打印的栈 */
void printStack(SqStack stack) {
	printf("\n");
	for(int i=0; i<=stack.top; i++) {// 注意:data[0]表示栈底元素,data[top]表示栈顶元素
		printf("%d\t",stack.data[i]);// 打印栈中元素
	}
	printf("\n");
}

/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */ 
void conversion(int N,int S) {
	/* 初始化栈 */
	SqStack stack;
	initStack(stack);// 初始化顺序栈
	int x;// 用来存储出栈的元素值
	/* 入栈 */
	while(N!=0) { // 循环
		push(stack,N%S);// 将余数压入栈中
		N=N/S;// 继续求商
	}
	/* 出栈 */
	while(stack.top!=-1) { // 当栈不为空时不断循环
		pop(stack,x);// 将栈的一个个数出栈形成需要的结果
		printf("%d",x);// 打印出栈元素
	}
}

int main() {
	int N;
	printf("请输入十进制数:");
	scanf("%d",&N);
	
	printf("十进制转八进制:");
	conversion(N,8);
	printf("\n");
	
	printf("十进制转十六进制:");
	conversion(N,16);
	printf("\n");
	
	printf("十进制转二进制:");
	conversion(N,2);
	printf("\n");

	return 0;
}

运行结果如下:

简化代码如下:

/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */
void conversion(int N,int S) {
	/* 初始化栈 */
	int stack[maxSize];
	int top=-1;
	int x;// 用来存储出栈的元素值
	/* 入栈 */
	while(N!=0) { // 循环
		stack[++top]=N%S;// 将余数压入栈中
		N=N/S;// 继续求商
	}
	/* 出栈 */
	while(top!=-1) { // 当栈不为空时不断循环
		x=stack[top--];// 将栈的一个个数出栈形成需要的结果
		printf("%d",x);// 打印出栈元素
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值