BeatificDevin

。。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题:用栈实现2进制数到十进制数的转换

解析:用到<math.h>库中的pow函数,pow(2,i)表示2^i。当进行形参到实参的传送时,需要改变栈中的元素时传入&s,当不改变栈中元素,只对栈s进行操作时,传入s

代码实现:

/*利用栈的特点将2进制数转换为10进制数 */ 
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ElemType char
#define Init_Stack_Size 30//当前栈的最大存储容量 
#define IncreasmentSize 1 //每次增加的大小 
typedef struct SqStack *LinkStack;
typedef struct SqStack
{
	ElemType *base;
	ElemType *top;
	int initSize;
}SqStack;

//初始化栈
void InitStack(SqStack *s)
{
	s->base = (LinkStack)malloc(Init_Stack_Size * sizeof(ElemType));
	if(!s->base)
	{
		printf("栈空间分配失败···\n");
		exit(0);
	}
	s->top = s->base;
	s->initSize = Init_Stack_Size;
} 

//入栈操作
void Push(SqStack *s,ElemType *e)
{
	if((s->top - s->base) >= s->initSize - 1)
	{
		s->base = (LinkStack)realloc(s->base,(s->initSize + IncreasmentSize)*sizeof(ElemType));
		if(!s->base)
		{
			exit(0);
		} 
		s->initSize = s->initSize + IncreasmentSize;
	} 
	*s->top = *e;
	s->top++;
} 

//出栈操作
void Pop(SqStack *s,ElemType *e)
{
	if(s->top == s->base)
	{
		return;
	}
	s->top--;
	*e = *s->top;
} 

//求栈的长度 
int StackLen(SqStack *s)
{
	return (s->top - s->base);
} 
//2进制转换为10进制 
void Bin2Dec(SqStack s)
{
	int i,len;
	long int sum = 0;
	ElemType c,e;
	InitStack(&s);
	printf("请输入您要转换的二进制数,输入字符 '#'结束:\n");
	scanf("%c",&c);
	while(c != '#')
	{
		Push(&s,&c);
		scanf("%c",&c);
	}
	getchar();//必须要有一个getchar(),因为输入时要输入enter键表示输入完成,如果没有这一句,enter键将被当做字符'\n'输入,影响结果 
	len = StackLen(&s);
//	printf("%d\n",len);
	for(i = 0;i < len;i++)
	{
		Pop(&s,&e);
		sum = sum + (e-48) * pow(2,i);//这里要注意e是字符型的,0的ASCII码为48,1的ASCII码为49,要转换一下 才能进行运算 
//		printf("%c",e);
	}
	printf("转换后的十进制数为:%ld\n",sum);
}

int main()
{
	int i,j;
	SqStack s;
	InitStack(&s);	
	Bin2Dec(s);
	getch();
	return 0;
}

  

posted on 2014-12-14 17:11  BeatificDevin  阅读(750)  评论(0编辑  收藏  举报