问题:用栈实现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; }
天道酬勤!