|
发表于 2020-3-7 19:17:51
|
显示全部楼层
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define STACK_INIT_SIZE 20
#define STACK_INCREMENT 10
#define BIN2OCT 0
#define BIN2DEC 1
#define BIN2HEX 0
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 + STACK_INCREMENT) * 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);
}
int main(void)
{
Elemtype c;
sqStack bin,oct,hex;
int i,len,sum = 0;
InitStack(&bin);
printf("请输入二进制数,以'#'结束!\n");
scanf("%c",&c);
while(c != '#')
{
Push(&bin,c);
scanf("%c",&c);
}
getchar(); //把'\n'从缓冲区去掉
len = StackLen(bin);
printf("二进制栈的当前容量是:%d\n",len);
#if BIN2DEC
for(i = 0;i < len;i++)
{
Pop(&bin,&c);
sum += (c-48) * pow(2,i);
}
printf("转化为十进制数是:%d\n",sum);
#endif
/*******************************************************************
二进制转化为八进制:每三位二进制数组成一个八进制数,然后压入栈中,
弹出的数即为八进制数,转化为十六进制同理
*********************************************************************/
#if BIN2OCT
InitStack(&oct);
for(i = 0;i < len;i++)
{
Pop(&bin,&c);
sum = sum + (c-48) * pow(2,i%3); //每三位二进制数组成一个八进制数
if((bin.base == bin.top)||((i+1)%3 == 0))
{
c = sum + '0';
Push(&oct,c);
sum = 0;
}
}
len = StackLen(oct);
printf("八进制栈的当前容量是:%d\n",len);
printf("转化为八进制数是:");
for(i = 0;i < len;i++)
{
Pop(&oct,&c);
printf("%c",c);
}
printf("\n");
#endif
#if BIN2HEX
InitStack(&hex);
for(i = 0;i < len;i++)
{
Pop(&bin,&c);
sum = sum + (c-48) * pow(2,i%4); //每三位二进制数组成一个八进制数
if((bin.base == bin.top)||((i+1)%4 == 0))
{
c = sum + '0';
Push(&hex,c);
sum = 0;
}
}
len = StackLen(hex);
printf("十六进制栈的当前容量是:%d\n",len);
printf("转化为十六进制数是:");
for(i = 0;i < len;i++)
{
Pop(&hex,&c);
printf("%c",c);
}
printf("\n");
#endif
return 0;
}
|
|