数据结构-线性表-栈的实例二进制转化为十进制

    二进制转化为十进制,是从一串二进制数的末尾(右边)开始,每位上数(0或1)×2^该数是第几个(从0开始)。

    例如:二进制数1101.01转化成十进制


    1101.01(2)=1*20+0*21+1*22+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25

    
    所以总结起来通用公式为

    abcd.efg(2)=d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3


    把最前的数先放进去,右边的数后放,根据栈先进后出的原则,刚好是适合进制转化。

    先建立一个空栈,然后,实现栈的几个操作,圧栈,弹栈,栈的长度等。最后循环输入二进制数。


    代码如下:


#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->base=s->top;
	s->stackSize=STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
	if(s->top - s->base >=STACK_INIT_SIZE)
	{
		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);
}

int main()
{
	ElemType c;
	sqStack s;
	int len,i,sum = 0;

	InitStack(&s);

	printf("输入一个二进制数,输入符号#结束:\n");
	scanf("%c",&c);
	while(c!='#')
	{
		Push(&s,c);
		scanf("%c",&c);
	}

	getchar();

	len = StackLen(s);
	printf("栈的当前容量是:%d\n",len);
	for (i=0;i<len;i++)
	{
		Pop(&s,&c);
		sum = sum +(c-48)* pow(2.0,i);
	}

	printf("转化为十进制的数为:%d\n",sum);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40452317/article/details/80550266
今日推荐