用栈来实现将一个十进制数转换成等值的二进制数或者八进制数

  • 栈的应用

栈的一个典型应用是将10进制数转换成等值的二进制数,或者八进制数,由于将十进制数转换成二进制数或者八进制数的时候符合栈的“后进先出”的特性,因为其算法思路就是不断取余然后最后进行逆序输出,所以可以使用栈这种数据结构来实现将十进制数转换成二进制数或者八进制数的算法,由于我们在将十进制数转换成其他的r进制数时用到的是除r取余法,在这个过程中我们所得的余数都应该被存储起来,然后最后逆序输出便可以得到一个十进制数的其它r进制数的表示形式,所以这个过程中我们应该先定义一个栈来存储我们所得的余数,最后不断将栈顶元素输出即可,这题我使用的是顺序栈来实现进制数转换的,关于顺序栈的定义与各种操作的实现我在上一篇博客讲到了,以下是关于顺序栈的定义与各种操作的实现的博客链接

http://t.csdn.cn/EH0E4

下面是代码实现,以及运行结果,关于算法的设计思路我已经在源代码的注释中给出了详细的注释

程序源代码


//栈的定义与运用
//栈是只允许在表一端进行插入和删除的线性表



#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>                      //使用realloc函数时需要包含此头文件
#define INIT_SIZE 10
#define STACKINCREMENT 10

//顺序栈:采用顺序存储的栈称为顺序栈

//定义一个顺序栈,其里面存放的数据类型维整型

typedef struct Sqstack
{
	int* top, * base;
	int stack_size;

}Sqstack,*Sq;


//构造空栈
void init_stack(Sq s);

//若栈不空则用于返回栈顶元素
int GetTop(Sq s);

//若栈不满则插入新的栈顶元素,若栈满,则增容量
void push(Sq s, int e);

//若栈不空则删除栈顶元素并将其作为函数返回值返;
int pop(Sq s);


int main()
{

    //栈的应用,将10进制数转换成等值的二进制数,由于将十进制数转换成其它进制数的时候符合栈的后进先出的特性所以可以使用栈这种数据结构来实现将10进制数转换成2进制数的算法,
	//这里其他进制数指的是八进制或者二进制,不指十六进制数

	//由于我们在将十进制数转换成其他的r进制数时用到的是除r取余法,在这个过程中我们所得的余数都应该被存储起来,
	//然后最后逆序输出便可以得到一个十进制数的其它r进制数的表示形式,所以我们应该先应该定义一个空栈用于存放我们的余数

	Sqstack s;
	Sq elem_binary = &s;
	init_stack(elem_binary);

	int n;//带转换的十进制数
	int r;//想要将n转换成的进制数,如二进制数,八进制数等;
	int mo;   //用于保存余数

	printf("请按顺序输入你想要进行转换的十进制数,以及你想将此十进制数转换成几进制数用阿拉伯数字表示,两个数字之间用半角逗号','分割\n");

	scanf("%d,%d", &n, &r);

	while (n > 0)
	{
		mo = n % r;
		push(elem_binary, mo);        //将求得的元素进行入栈

		n = n / r;


	}
	//将所有的余数入栈后进行逆序输出其实就是从栈顶元素开始进行出栈操作

	while (elem_binary->top != elem_binary->base)
	{
		printf("%d", pop(elem_binary));
	}
	

	return 0;


}

void init_stack(Sq s)
{
	s->base = (int*)malloc(sizeof(int) * INIT_SIZE);                         //要养成一个好习惯当使用动态分配内存的函数时需要判断一下动态分配内存是否成功
	
	if (!(s->base))
		exit(-1);                        //判断动态分配内存是否成功;
	
	s->top = s->base;
	s->stack_size = INIT_SIZE;
		
}

int GetTop(Sq s)
{
	if (s->top == s->base)                //注意赋值符号和等好的区别;可以细心一点吗;        
	{
		printf("ERROR\n");
		return -1;
	}
	else
		return *(s->top - 1);
}


void push(Sq s, int e)
{
	//先判断是否栈满,栈满则追加空间;
	if ((s->top - s->base) >= (s->stack_size))
	{
		s->base = (int*)realloc(s->base, sizeof(int) * STACKINCREMENT);
		if (!s->base)
		{
			printf("ERROR\n");
			exit(-1);
		}
		//注意当原来的地址后面没有STACKINCREMENT个空间时,relloc函数会重新开辟一个新的空间,然后将新空间的地址作为函数值返回,并将原来的值新拷贝一份到新的空间

		s->stack_size += STACKINCREMENT;

		*(s->top) = e;
		(s->top)++;

	}
	else
	{
		*(s->top) = e;
		(s->top)++;

	}

}

int pop(Sq s)
{
	//先判断是否是空栈
	if (s->top == s->base)               //注意赋值符号和等于号啊!!!
	{
		printf("ERROR\n");
		return -1;
	}
	else
	{
		(s->top)--;
		return *(s->top);                   //注意语句顺序!!!
		
	}
}

运行结果截图 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值