题目: 利用栈实现如下两种类型的进制转换:
(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 );
}
}
}