题目要求
编写一段程序,要求从终端输入一串0/1表示的二进制数,输出它的八进制表达形式。
题目分析
进行数制转换这类运算最简单的方法就是使用栈的数据结构。
(1)在输入二进制数时,将每次输入的0/1压入栈A中保存。
(2)转换时,要将二进制的每三位转换成八进制的一位,先得到的是八进制的低位数,因此可以将八进制数保存到一个新的栈B中,知道将栈A中的元素取完为止。
(3)最后将栈B 中的八进制逐一取出显示即可。
(初始化,入栈,出栈等) 进制存储用ASCII码值。
程序如下:
#include"stdio.h"
#include"math.h"
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char Elemtype;
typedef struct {
Elemtype *top;
Elemtype *base;
int stacksize;
}sqstack;
//初始化栈
void initstack(sqstack *s)
{
//内存中开辟一段连续的空间作为栈空间,首地址给s->base
s->base=(Elemtype *)malloc(sizeof(Elemtype)*STACK_INIT_SIZE);
if(!s->base) exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
//入栈操作,将e压入栈中
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=s->base+s->stacksize; //追加空间首地址加上原大小为顶
s->stacksize=s->stacksize+STACKINCREMENT;
*(s->top)=e;
s->top++;
}
//出栈操作,用e将栈顶元素返回
void pop(sqstack *s,Elemtype *e)
{
if(s->top==s->base) return ;
*e=*--(s->top);
}
//计算栈当前长度
int stacklen(sqstack *s)
{
return(s->top-s->base);
}
main()
{
sqstack s1,s2;
Elemtype c;
int len,i,j,sum=0;
initstack(&s1);
printf("Please input a binary number and type # for end\n");
scanf("%c",&c);
while(c!='#')
{
if('c'==0||'c'==1)
push(&s1,c);
scanf("%c",&c);
}
initstack(&s2);
len=stacklen(&s1);
for(i=0;i<len;i=i+3)
{
for(j=0;j<3;j++)
{
pop(&s1,&c);
sum=sum+(c-48)*pow(2,j);
if(s1.top==s1.base) break; //有可能不是3的倍数
}
push(&s2,sum+48);
sum=0; //计算八进制每一位时别忘了sum清0
}
//输出八进制内容
while(s2->top!=s2->base)
{
pop(&s2,&c);
printf("%d",c);
}
getche();
}