用栈来实现将一个十进制数转换成等值的二进制数或者八进制数
[*]栈的应用
栈的一个典型应用是将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); //注意语句顺序!!!
}
}
运行效果截图https://i-blog.csdnimg.cn/blog_migrate/837c3bed1a390c6fd24dae2afee87b74.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]