栈应用之进制转换(C语言)

通过入栈和出栈实现二进制与十进制的相互转换

二进制转十进制的步骤:

100110 = 0×20 + 1×21 + 1×22 + 0×23 + 0×24 + 1×25 = 38

我们在键盘敲入100110时,就要把每一个数字进行入栈:
在这里插入图片描述
这样再将栈中的元素出栈,再进行数学运算即可。需要注意的是,二进制数字是以字符型传入,若以int型传入,则100110成为了一个整体,无法将每一位分开。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct	//创建一个栈
{
	char * base;	//栈底	由于栈存放的是char型数据,指针类型也应为char*型
	char * top;		//栈顶
	int stacksize;  //栈的容量
}Sqstack2;

void initstack(Sqstack2*s)	//栈的初始化函数
{
	s->base = (char*)malloc(20 * sizeof(char));	//开始时申请20块连续的内存单元
	if (!s->base)	//检测内存是否分配成功
	{
		exit(0);
	}
	s->top = s->base;	//开始是为空栈,栈顶和栈底的地址相同
	s->stacksize = 20;	//分配内存成功后更新栈的容量
}

void push(Sqstack2*s,char x)	//入栈函数
{
	if (s->top - s->base >= s->stacksize)	//先检测是否发生上溢
	{
		s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));	//若发生,则增加10个内存空间(动态扩容)
		if (!s->base)	//检测内存是否分配成功
		{
			exit(0);
		}
		s->stacksize = s->stacksize + 10;
		s->top = s->base + 10;
	}
	*(s->top) = x;	//开始将数据存入栈中
	s->top++;	//存入一个数据,栈顶的地址相应增加(top位于最外侧数据的上一个单元)
}

void pop(Sqstack2*s, char * x)	//出栈函数
{
	if (s->top == s->base)	//检测是否发生下溢
	{
		return;
	}
	s->top--;
	* x = *(s->top);	//利用指针将数据传出
}

int stacklen(Sqstack2*s)	//计算栈中元素个数函数
{
	return (s->top - s->base);	//这里并不是将地址相减,而是以char位单位计算元素个数
}

int main()
{
	char c;	
	Sqstack2 * s = (Sqstack2*)malloc(sizeof(Sqstack2));	//申请一块Sqstack类型的内存的单元并用指针s存放此单元的地址
	int len, i, sum = 0;
	initstack(s);	//先将栈初始化
	printf("请输入二进制数:");
	c=getchar();	//输入数字
	while (c != '#')	//当输入#时表示输入完毕
	{
		push(s, c);	//将输入的数字入栈
		c=getchar();	//继续输入下一个数字
	}
	len = stacklen(s);	//len表述栈中元素个数
	for (i = 0; i < len; i++)
	{
		pop(s, &c);	//将元素出栈,函数用指针将数值赋值到c上
		sum = sum + (c - 48)*pow(2, i);	//查看ASCII码,用c-48将数字由char型转换为int型,并进行数学运算
	}
	printf("您所要的结果是:%d", sum);
	return 0;
}

在这里插入图片描述
二进制转十进制是通过取余的方法解决的:

38(10)=100110(2)

38/2=19余0,那么0则先入栈,19/2=9余1,1再入栈,9/2=4余1,1再入栈,4/2=2余0,0再入栈,2/2=1余0,0再入栈,1/2=0余1,1最后入栈。
那么栈底至栈顶依次是:100110

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct
{
	int * base;
	int * top;
	int stacksize;
}Sqstack1;

void transform(int m,int n)	//这里为了简便省去了许多检测条件和处理方法
{
	int r;
	//栈的初始化
	Sqstack1 * s = (Sqstack1*)malloc(sizeof(Sqstack1));
	s->base = (int*)malloc(10 * sizeof(int));
	s->top = s->base;
	s->stacksize = 10;
	//模拟相除取余
	while (m!=0)
	{
		r = m % n;
		*(s->top) = r;	//余数入栈
		s->top++;	//栈顶++
		m = m / n;
	}
	int len = (s->top) - (s->base);	//得到栈的元素个数
	printf("您要的结果是:");
	for (int i = 0; i < len; i++)
	{
		s->top--;	//先让top指向元素
		printf("%d", *(s->top));
	}
}

int main()
{
	int m, n;
	printf("请输入一个十进制数:");
	scanf_s("%d", &m);//十进制数
	printf("请输入要转换的进制:");
	scanf_s("%d", &n);//要转换的进制
	transform(m, n);
	return 0;
}

在这里插入图片描述
兄弟萌仔细观察就能发现,第一个程序还可以完成其他进制到十进制的转换,第二个程序还可以完成十进制到其他进制的转换,其实两者结合就可完成某进制到某进制的转换(以十进制为跳板)。但常用的是二、八、十、十六进制。由此,二进制转八、十六进制的方法是什么呢?(除了以十进制为跳板)“三位一组”、“四位一组”,不知对宁是否有所启发呢?


版权声明:本文为weixin_43237362原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。