利用栈表的特性,实现任何整数的多进制输出

这篇博客介绍了如何使用顺序栈的数据结构来实现任意整数的多进制转换。通过短除法,将余数压栈,然后依次出栈得到进制转换后的数字。博客中给出了C语言实现的详细代码,包括栈的初始化、压栈、弹栈等操作,并展示了将整数转化为指定进制的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:利用栈表的特性,实现任何整数的多进制输出

注意:整数转化为多进制使用的时候,使用短除法
思路:将余数进栈,进行计算,最后输出相应的进制

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//定义顺序栈的管理节点
typedef struct stack
{
	int *num;//顺序栈的数据域
	int size;//设置数据域的长度
	int top;//顺序表的栈顶位置
}stack,*pstack;

//初始化顺序栈
pstack stack_init(int size)
{
	//申请顺序栈
	pstack mystack=malloc(sizeof(stack));
	if(mystack ==NULL)//判断栈表是否创建成功
	{
	   printf("栈表创建失败\n");
	   return NULL;
	}
	
	//初始化栈表
	//申请数据域的存储空间
	mystack->num=malloc(size*sizeof(int));
	mystack->size=size;//记录栈表的总长
	//栈顶初始化
	mystack->top=-1;
	return mystack;
}

//空栈
bool stack_empty(pstack mystack)
{
	return mystack->top==-1;
}

//满栈
bool stack_full(pstack mystack)
{
	return mystack->top == mystack->size-1;
}


//压栈  尾插数据
int push_stack(pstack mystack,int n)
{
	//判断栈表是否已满
	if(stack_full(mystack))
	{
		printf("满栈状态\n");
		return -1;
	}
	
	//压栈数据  尾部插入
	//栈顶自增 ++
	mystack->top++;
	//数据域赋值
	mystack->num[mystack->top]=n;
	return 0;
}

//弹栈  尾部删除
int pop_stack(pstack mystack)
{
	//判断是否为空栈
	if(mystack->top == -1)
	{
	    printf("栈表为空表\n");
		return -1;
	}
	
	//从栈顶获取数据
	int someone=mystack->num[mystack->top];
	
	//栈顶位置 --
	mystack->top--;
	
	//返回弹栈结果
	return someone;
}

//弹栈  尾部删除 参数返回弹栈结果
int pop1_stack(pstack mystack,int *n)
{
	//判断是否为空栈
	if(stack_empty(mystack))
	{
	    printf("栈表为空表\n");
		return -1;
	}
	
	//从栈顶获取数据
	*n=mystack->num[mystack->top];
	
	//栈顶位置 --
	mystack->top--;
}

//检测一下数据
void show(pstack mystack)
{
	//判断是否为空栈
	if(mystack->top == -1)
	{
	    printf("栈表为空表\n");
		return;
	}
	for(int i=0;i<=mystack->top;i++)
	{
		printf("-%d",mystack->num[i]);
	}
	printf("\n");
}

//进制转化                   整数   进制数
int convert(pstack mystack,int num,int radix)
{
	//定义一个整数保存商的结果
	int trade;
	trade=num/radix;
	//让余数压栈
	push_stack(mystack,num%radix);
	//思想:让商继续完成取余工作
	while(trade != 0)
	{
		//让余数压栈
		push_stack(mystack,trade%radix);
		//获取商的结果
		trade = trade/radix;
	}
	//保存栈顶的位置、
	int topnum=mystack->top;
	int ret;
	
	//打印进制数据
	printf("%d数据的%d进制为:",num,radix);
	for(int i=0;i<=topnum;i++)
	{
		//获取每次出栈的结果
		ret=pop_stack(mystack);
		switch(ret)
		{
			case 10:printf("A");break;
			case 11:printf("B");break;
			case 12:printf("C");break;
			case 13:printf("D");break;
			case 14:printf("E");break;
			case 15:printf("F");break;
			default:printf("%d",ret);break;
		}
	}
	printf("\n");
}

int main()
{
	//初始化栈表
	pstack mystack=stack_init(10);
	
    int num,radix;
	printf("请输入整数以及进制数\n");
	scanf("%d %d",&num,&radix);
	convert(mystack,num,radix);
	return 0;
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值