当前位置:网站首页>利用栈来实现二进制转化为十进制

利用栈来实现二进制转化为十进制

2022-07-07 10:27:00 舍不得,放不下

如何实现二进制转化为十进制呢?

举个栗子吧:比如(100101)2(这个2是下标哈)转化为十进制的方法:

1*2^0+0*2^1+1*2^2+0*2^3+0*2^4+1*2^5

知道这个接下来就好办了:100101入栈顺序1->0->0->1->0->1

废话不多数,直接上代码

先用结构体定义一个栈:

typedef struct {
	ElemType *base;
	ElemType *top;
	int stacksize;
} sqstack;

初始化栈:

void InitStack(sqstack *s) { //初始化栈
	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //malloc申请空间,
	if (!s->base) { //如果申请失败
		exit(0);
	}
	s->top = s->base; //栈顶等于栈底
	s->stacksize = 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));//realloc申请空间,将原有数据保存,并添加新的空间,来找新的一份空间储存数据
	 
		if (!s->base) {
			exit(0);
		}
	}
	*(s->top) = e;//栈顶赋值 
	s->top++;//栈顶+1 
}

抛出(出栈)操作:

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, 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 (int i = 0; i < len; i++) {
		Pop(&s, &c);
		sum = sum + ((c - 48) << i);//c-48由ascll码表转化为整形,(c-48)<<i位运算相当于2^i 
	}
	printf("转化的十进制数是:%d\n", sum);
	return 0;
}

整个代码:

#include<stdio.h>
#include<stdlib.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)); //malloc申请空间,
	if (!s->base) { //如果申请失败
		exit(0);
	}
	s->top = s->base; //栈顶等于栈底
	s->stacksize = 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));//realloc申请空间,将原有数据保存,并添加新的空间,来找新的一份空间储存数据
	 
		if (!s->base) {
			exit(0);
		}
	}
	*(s->top) = e;//栈顶赋值 
	s->top++;//栈顶+1 
}
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, 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 (int i = 0; i < len; i++) {
		Pop(&s, &c);
		sum = sum + ((c - 48) << i);//c-48由ascll码表转化为整形,(c-48)<<i位运算相当于2^i 
	}
	printf("转化的十进制数是:%d\n", sum);
	return 0;
}

原网站

版权声明
本文为[舍不得,放不下]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_62599387/article/details/125578784

随机推荐