• 栈的应用

栈的一个典型应用是将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;}elsereturn *(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. c语言8进制数与16进制数,C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制.八进制和十六进制. 二进制数.八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八 ...

  2. 计算机二进制基础列式,计算机基础;十进制数100对应的二进制数、八进制数和十六进制数分别是...

    中计数采用了多种记数制,比如:十进制,六十进制(六十秒为一分,六十分为一小时,即基数为60,运算规则是逢六十进一),--.在计算机中常用到十进制数.二进制数.八进制数.十六进制数等,下面就这几种在计算 ...

  3. 二进制数、八进制数、十六进制数与…

    整数在内存中是以补码的形式存放的.(符号位1表示负,0表示正) 正数的补码和源码相同:负数的补码=该数绝对值的二进制数-取反-加1: 一个有符号的int型变量(当时2个字节时)取值范围:-2∧15~( ...

  4. 利用栈的基本操作,将一个十进制数转换成8进制数

    题目 利用栈的基本操作,将一个十进制数转换成8进制数 #include<iostream>using namespace std;#define MAXSIZE 100 typedef i ...

  5. 利用栈的特性,将十进制数转换成八进制数

    栈的特定是:先进后出 源程序: //这个程序的目的是让用户输入一个十进制数,然后打出这个数的八进制数 #include<iostream> using namespace std; #de ...

  6. 十进制转二进制转换c语言程序,c语言编程如何实现-十进制数转换成二进制和 – 手机爱问...

    2006-10-10 (1).将十进制正整数转换成k进制(2<=k<=9)的数字输出.例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示1000). (2).请编写函数vo ...

  7. 将十进制数转换成二进制数(C语言)

    C语言--将十进制数转换成二进制数 方法:除 2 取余,逆序排列 原理:用 2 整除十进制整数,可以得到一个商和余数:再用 2 去除商,又会得到一个商和余数,如此进行,直到商为小于 1 时为止,然后把 ...

  8. OJ刷题记录:将十进制数转换成八进制数 题目编号:545

    将十进制数转换成八进制数 题目编号:545 题目要求: 将三个十进制数分别转换成八进制数,建议使用栈来实现. 输入描述 输入三个十进制数,每个占一行. 输出描述 输出每个十进制数所对应的八进制数,每个 ...

  9. C语言算法之将十进制数转换成二进制数

    导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了.下面给大家讲述一下如何编程实现将十进制数转换成二进 ...

最新文章

  1. 为什么越来越多的程序员开始学机器学习?揭秘一个重要原因
  2. C语言试题八十三之输出左下三角形九九乘法表
  3. 内存heap_哪个内存更快?Heap或ByteBuffer或Direct?
  4. BZOJ 2301 - Problem b(莫比乌斯反演+容斥)
  5. 2.移植uboot-添加2440单板,并实现NOR、NAND启动
  6. Tiktok的红利期,你要加入吗?
  7. 数组类型和多维数组的本质
  8. numpy的array_equal函数
  9. 修身齐家治国平天下的领导者自我管理哲学
  10. C语言---找零问题------程序优化
  11. win10输入法不能切换_怎么解决win10系统微软输入法打不出汉字
  12. spring集成kafka运行时报错:Failed to construct kafka producer] with root cause
  13. 关于硬盘分区合并的事
  14. 中地数码:融合创新国产GIS 乘风而上助推实景三维中国建设
  15. 另一程序正在使用此文件,进程无法访问
  16. 发布Sensor_msgs::JointState关节位置或速度实现Barrett Hand机械手控制
  17. Python 在连接数据库的时候报错
  18. 常见电子元件在电路中的作用
  19. 追踪算法【亟待解决】
  20. java定义geinfo_Java ResourceInfo類代碼示例

热门文章

  1. Jboss seam特点优势
  2. java写genesis脚本,PCB Genesis脚本 C#调用Python
  3. 面试高能:阿里面试官笔记,凭借这份文档面试过蚂蚁,我要自学网java基础百度云
  4. SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用
  5. python实现图片拼接长图_Python 拼接多张尺寸大小不一样的图片制作长图
  6. 自建Kubernetes的LoadBalancer类型服务方案-MetalLB
  7. 面向对象系统分析与设计,让你真正了解什么是面向对象(傻瓜式讲解)
  8. Python闭包详解
  9. 通过 intent安装 apk
  10. 汽车vr汽修仿真实训软件,清晰直观全面的认识和了解汽车构造