数制转换--十进制转换任意进制---栈--初始化--调用--每日一练(七)

本文介绍了如何使用栈来实现从十进制到任意进制的转换。通过定义结构体栈,包括栈底指针、栈顶指针和栈的大小,并实现初始化、入栈、出栈等操作。在转换过程中,将十进制数除以目标进制的余数依次入栈,然后逆序出栈得到目标进制的数字。
摘要由CSDN通过智能技术生成
//注意:1、书上写的都不是完成的代码,知识模块话的写了初始化栈,入栈,出栈这些,要明白函数定义中参数的真正含义
//2、mian函数中首先要定义一个栈结构体并且命名
//3、初始化栈时要赋予栈的首地址给initstack函数,而后面所有函数都要加*号
//4、出栈的时候注意保存出栈元素还是直接printf,灵活运用
 
//********十进制数转任意进制数-栈完成******************
#include<stdio.h>
#include<stdlib.h>  //  exit(1)需要加这个库;
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define DataType int //宏定义数据类型,方便修改
typedef struct{                       
     DataType *top;
     DataType *base;
     int stack_size;
}sqstack;//这里定义了结构体栈,包含了栈底指针,栈顶指针还有栈的大小
void Initstack(sqstack *s) //初始化的时候定义的栈叫S1,但是传值给这些调用函数的时候记住它们是指针,要加上*
{
     s->base=(DataType *)malloc(STACK_INIT_SIZE*sizeof(DataType));//强制转换的类型不对,已修改
     if(!s->base) exit(-1);
     s->top=s->base;
     s->stack_size=STACK_INIT_SIZE;
}
void Push(sqstack *s, DataType e)//入栈,传入栈的首地址和入栈元素
{
  if(s->top-s->base>=s->stack_size )//栈满,追加存储空间
   {
     s->base=(DataType*)realloc(s->base,(s->stack_size +STACKINCREMENT)*sizeof(DataType));
     if(!s->base) exit(-1);//存储分配失败
     s->top=s->base+s->stack_size;
     s->stack_size+=STACKINCREMENT;
     }
  *s->top++=e;//入栈一个元素
}
void Pop(sqstack *s)//出栈,本来这里还有一个e作为传值函数,但是实际应用中要直接printf即可,
	                 //没有必要再花一个指针去指向这个出栈元素存储空间。
{
   	if(s->top==s->base)exit(-1);
   	printf("%X",*--s->top);//可以输出16进制以内的任何数制
}
int StackEmpty(sqstack *s)
{
  if(s->top==s->base) return 1;
   else return 0;
}//判断栈是否为空
void conversion(int a,int b)
{    
     sqstack S1;//不应声明成指针,已修改,这个一定要注意,先声明一个栈并命名,S1,S2都可以
     Initstack(&S1);//构造空栈
     while(a)//当a本身即为0时没有输出,考虑过a为负数的情况没?
     {
         Push(&S1,a%b);//已修改
         a=a/b;
     }
     while(!StackEmpty(&S1))//这里StackEmpty(&S1)函数我定义为int型,为了这里的判断用的,函数代表了返回值
     {
         Pop(&S1);//
         //printf("%d",e);//当基数大于9时输出结果不对。改成printf("%x", i);可以实现16进制内的输出。
		        //改成printf("%c", (i < 10) i+'0' : i - 10 + 'A');可以实现36进制内的输出
     }
    }
void main(int argc,char *argv[])
{
     int a,b;
     printf("please input the data you want to conversion\n");
     scanf("%d",&a);
     printf("please input the scale you want to convert to\n");
     scanf("%d",&b);
     conversion(a,b);
 }	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值