二进制转化为十进制,是从一串二进制数的末尾(右边)开始,每位上数(0或1)×2^该数是第几个(从0开始)。
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; }