c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>

//c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>

/*
初始化栈
输入要转换的进制并进行判断是否在制定进制内
输入要转换的整数并判断改整数是否大于零
循环当整数不为零的时候
{
     先对该整数求余(选择的进制)
	 余数进栈
	 在对该整数求除(选择的进制)
}
循环当栈不为空
{
     出栈
}
*/

//---------头文件----------
#include<stdio.h>
#include<stdlib.h>

//---------宏定义----------

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//---------替换和结构体-----------

typedef int Bool;
typedef struct
{
	int *base,*top;
	int stacksize;
}SqStack,*Stack;

//--------函数列表--------
Bool InitStack(Stack s);
Bool StackEmpty(Stack s);
Bool Push(Stack s,int e);
Bool Pop(Stack s,int *e);

//--------主函数---------

void main()
{
	SqStack sq,*s=&sq;
	int n,integer,e,flag=1;
	InitStack(s);
	while(flag)
	{
		printf("输入要转换的进制:(2,8or16):");
		do
		{
			scanf("%d",&n);
			if(2!=n&&8!=n&&16!=n)
			{
				printf("输入转换进制错误!重新输入.\n");
			}
		}while(2!=n&&8!=n&&16!=n);
		printf("输入要转换的十进制整数(integer>0):");
		do
		{
			scanf("%d",&integer);
			if(integer<=0)
			{
				printf("输入整数错误!重新输入.\n");
			}
		}while(integer<=0);
		while(integer)
		{
			Push(s,integer%n);
			integer/=n;
		}
		printf("转换后的结果:");
		while(!StackEmpty(s))
		{
			Pop(s,&e);
			e=e>=10?e+87:e+48;
			printf("%c",e);
		}
		printf("\n");
		printf("(退出0&&继续1):");
		do
		{
			scanf("%d",&flag);
			if(0!=flag&&1!=flag)
			{
				printf("输入错误!重新输入.\n");
			}
		}while(0!=flag&&1!=flag);
		printf("\n");
	}
	//free(s);
	getchar();
	getchar();
}

//--------其余函数--------

Bool InitStack(Stack s)
{
	if(!(s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))
	{
		exit(OVERFLOW);
	}
	s->top=s->base;
	s->stacksize=STACK_INIT_SIZE;
	return TRUE;
}

Bool StackEmpty(Stack s)
{
	return s->base==s->top?TRUE:ERROR;
}

Bool Push(Stack s,int e)
{
	if(s->top-s->base>=s->stacksize)
	{
		if(!(s->base=(int *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int))))
		{
			exit(OVERFLOW);
		}
		s->top=s->base+s->stacksize;
		s->stacksize+=STACKINCREMENT;
	}
	*(s->top++)=e;
	return TRUE;
}

Bool Pop(Stack s,int *e)
{
	if(s->base==s->top)
	{
		return ERROR;
	}
	*e=*(--s->top);
	return TRUE;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值