利用栈实现如下两种类型的进制转换

题目: 利用栈实现如下两种类型的进制转换:

(1)十进制转换为ニ进制;

 ( 2 ) 二进制转换为十进制。

要求:从键盘输入要转换的十进制数或二进制数,如输入的为十进制数则以'$'结束,如输入的为二进制数则以'#'结束。利用结束符'$''#'自动识别要做的转换类型,并将对应的转换结果输出。

需求分析

根据要求在输入后需要为了判断是要十进制转换为二进制还是要二进制转换为十进制而进行判断选择。如果是二进制转十进制的话,则需要进行字符型的输入和输出,如果是十进制转二进制则需要先进行字符型数据转整型数据的操作,再进行十进制转二进制的计算。

栈的设计代码

const int maxsize = 100;
typedef char Elemtype;									//将代码中所有Elemtype改为char 
//定义栈 
typedef struct
{
	Elemtype *top;
	Elemtype *base;
	int stacksize;
}sqstack;
//初始化栈 
void initstack(sqstack &s)
{
	s.base = (Elemtype *)malloc(sizeof(Elemtype) * maxsize);
	if(!s.base)
		exit(0);
	s.top = s.base;
	s.stacksize = maxsize;
	

}
//压栈 
void push1(sqstack &s,Elemtype e)//二进制转十进制
{
	*s.top = e;
	s.top ++;

}

void push2(sqstack &s, int n)//十进制转二进制
{
	*s.top++ = n;
}
//弹栈 
void pop1(sqstack &s,Elemtype &e)//二进制转十进制
{
	if(s.top == s.base)
		return;
	e = *--s.top;
}

int pop2(sqstack &s)//十进制转二进制
{
	return *--s.top;
}

//栈的当前容量 
int stacklen(sqstack s)
{
	return(s.top - s.base);
}

//判断栈是否为空
bool is_stackempty(sqstack s)
{
	if(s.base == s.top)
		return true;
	else
		return false;
}

 主函数的设计代码

int main()
{
	Elemtype c;										//二进制以字符形式输入 
	//int y;
	sqstack s;
	initstack(s);
	 
int len,i,sum = 0;
int flag;

printf("输入二进制数以#表示结束/输入十进制数以$表示结束!\n"); 
scanf("%c",&c);

while(c != '#')
{   
	push1(s,c);
	scanf("%c",&c);
	if(c=='#') {
	flag=1;
	break;
	}
	if(c=='$'){
	flag=0;
	break;
	}
	if(c=='\n'){
		printf("输入错误"); 
		flag=3;
		break ;
	}
}
getchar();						//把'\n'从缓冲区去掉 
len = stacklen(s);				//获取栈的当前容量 



if(flag==1){
	for(i = 0;i<len;i++)
{
	pop1(s,c);
	sum = sum +(c-48) * pow(2,i);	
}
printf("转换为十进制为:%d",sum);
return 0;
}

if(flag==0){
	printf("转换为二进制为:");
	for(i=0;i<len;i++){
		pop1(s,c);
		sum=sum+(c-48)*pow(10,i);
	}
	while(sum>=2){
		//printf("%d",sum%2);
		push2(s,sum%2);
		sum/=2;
	}
	push2(s,sum);
	while(!is_stackempty(s))
	{
		int x = pop2(s);
		printf("%d",x );
	}
	
}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值