利用栈的LIFO特点将二进制数转换为十进制数

栈的LIFO特点:

我们知道“栈”这种数据结构具有后进先出(LIFO)的特点,也就是最后入栈的数据最先被弹出。那这跟进制转换有什么关系呢?

进制转换原理:

假如我们从键盘输入一个二进制数1101,先看人工是如何转换成十进制的?我们只需要将二进制不同位上的数乘上它相应的权值即可,也就是1*2^0+0*2^1+1*2^2+1*2^3=13。也就是最后被输入的数字权值最低。所以用计算机模拟的话,就是利用栈的LIFO特点将数字一个一个的弹出,再乘上相应的权值,最后相加。

代码如下:

///利用栈的LIFO特点将二进制转化为十进制
#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->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+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);
}

main()  //主函数
{
	ElemType c;
	sqStack s;
	int len,i,sum=0;
	InitStack(&s);
	
	printf("Please input a binary number,end with #:\n");
	scanf("%c",&c);
	while(c != '#')
	{
		Push(&s,c);
		scanf("%c",&c);
	}
	getchar();  //将输入完成后的回车(‘/n‘)从键盘缓冲区取出,避免造成下次输入时程序混乱	
	len = StackLen(s);
	printf("The length of current stack is :%d\n",len);  //输出当前栈的长度
	for (i =0;i < len;i++)
	{
		Pop(&s,&c);
		sum = sum + (c-48)*pow(2,i); 
	}
	printf("The decimal number is :%d\n",sum);
	return 0;
}
结果展示:


阅读更多

没有更多推荐了,返回首页