问题:用栈实现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;
}