栈
利用栈的数据结构,将二进制转换为十进制
- 首先初始化创建一个栈
- 然后通过循环语句输入二进制0/1,用’#”作为结束标志。在输入的过程,用push()将二进制字符串从高位到低位顺序压栈
- 输入完毕,用StackLen()函数得到二进制的长度,然后通过循环逐一从栈顶取数,用pop()函数实现,取出的字符存放在变量c中,c-48是为了得到字符对应的0/1值,0的asii码为48,函数pow(x,y)是计算x的y次方,通过sum=sum+(c-48)*pow(2,i);
- 最终sum就是输入的二进制数对应的十进制数,将其输出到屏幕
/*利用栈的数据结构,将二进制转换为十进制数*/
include "stdio.h"
#define Stack_INIT_size 100;
#define Stackincrement 10;
typedef char ElemType;
typedef struct{
ElemType * base; //base指向栈底的指针变量
ElemType * top; //top指向栈顶的指针变量
int stacksize; //指示栈的当前可使用的最大容量
}
sqStack;
void initStack(sqStack *s)
{
/*内存中开辟一段连续的空间作为栈空间,首地址赋值给s->base*/
s-> base=(ElemType *) malloc (Stack_INIT_size *sizeof(ElemType));
if(!s->base) exit(0);
s->top=s->base; //最开始的时候,栈顶就是栈底此时为空栈
s->stacksize=Stack_INIT_size;//最大的容量为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=s->base+s->stacksize;
s->stacksize=s->stacksize+Stackincrement;
}
*(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);
}
DestroyStack (sqStack *s){
free(s->base); //释放内存空间
s->base=s->top=NULL; //栈底栈顶的指针置NULL
s->stacksize=0;
}
int main(){
ElemType c ;
sqStack s;
int len,i,sum=0;
printf("please input a Binary digit\n");
initStack(&S);
scan("%c",&c);
while(c!='#'){
Push(&s,c);
scanf("%c",&c);
}
getchar();
len=StackLen(s);
//得到栈中的元素个数
for(i=0;i<len;i++){
Pop(&s,&c);
sum=sum+(c-48)*pow(2,i);
}
printf("Decimal is %d \n",sum);
DestroyStack(&s);
getche();
}