二进制转十六进制(参考XYJ)

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

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef char ElemType; //每输入一个位存入一个字符
typedef struct
{
	ElemType *base;
	ElemType *top;
	int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
	s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
	if ( !s->base )
		exit (0);
	s->top=s->base;
	s->stackSize=STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
	if( s->top - s->base > s->stackSize)
	{
		s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType));
		if(!s->base)
			exit (0);
	}
	*(s->top)=e;
	s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
	if(s->top == s->base)
		return;
	*e=*--(s->top);
}

int StackLen(sqStack s) //不会进行修改,直接传数据进来就行
{
	return (s.top - s.base); //指针相减,不是地址相减,而是指向元素的值//s是结构,使用点
}

int main()
{
	ElemType c, d;
	sqStack s, n;
	int len, len_n, i, j, sum=0, temp=0;
	InitStack(&s);
	InitStack(&n);
	printf("请输入二进制数,输入#符号表示结束!\n");
	scanf("%c", &c); // 以字符的形式
	while( c != '#') // 从最高位开始压栈
	{
		Push(&s, c);
		scanf("%c", &c);
	}
	getchar(); // 把回车'\n'从缓冲区去掉
	len=StackLen(s);
	printf("栈的当前容量是:%d\n", len);

	for(i=0; i<len; i++)
	{
		Pop(&s, &c);
		if((i+1)%4 != 0)
		{
			sum+=(c-'0')*pow(2, i%4);
		}
		else
		{
			sum+=(c-'0')*pow(2, i%4);
			d=sum;
			Push(&n, d);
			sum=0;
		}
	}
	if(len%4 != 0)
	{
		d=sum;
		Push(&n, d);
	}

	len_n=StackLen(n);
	printf("新栈的当前容量是:%d\n", len_n);
	printf("转换为十六进制数为:");
	for(j=0; j<len_n; j++)
	{
		Pop(&n, &d);
		printf("%x", d);
	}
	printf("\n");

	return 0;
}

你可能感兴趣的:(二进制转十六进制(参考XYJ))