目录

1.定义与概念

2.代码实现

3.结果


1.定义与概念

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

viod *malloc(size_t size)

向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

2.代码实现

/*********************************************/
/*      使用栈将二进制转换成八/十/十六进制     */
/*             By Jo  17/05/01              */
/********************************************/#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACK_INIT_SIZE 20  //栈初始化大小
#define STACKINCREMENT 10   //栈扩容时每次增加大小typedef char ElemType;      //以字符形式存储二进制数据
typedef struct
{ElemType *base;       //栈低指针ElemType *top;        //栈顶指针int stackSize;        //栈尺寸
}sqStack;//函数功能:初始化栈(为栈分配内存空间)
//参数*s  :栈对象地址
void InitStack(sqStack *s)
{s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));if (!s->base) exit(0);s->top = s->base;s->stackSize = STACK_INIT_SIZE;
}//函数功能:数据入栈
//参数 *s :栈对象地址
//参数 e  :待入栈数据
void Push(sqStack *s, ElemType e)
{if (s->top - s->base >= s->stackSize) //栈当前容量大于存储容量,拓展栈大小{s->base = (ElemType*)realloc(s,(STACK_INIT_SIZE + STACKINCREMENT) * sizeof(ElemType));if (!s->base) exit(0);}*(s->top) = e;s->top++;
}//函数功能:数据出栈
//参数 *s :栈对象地址
//参数 *e :待存放出栈数据的对象地址
void Pop(sqStack *s, ElemType *e)
{if (s->base == s->top) return;*e = *--(s->top);       //栈始终指向栈顶,所以栈顶指针先减1再取出值
}//函数功能:获取栈长度
//参数s  :栈数据对象
//(函数若要修改实参,使用指针->;若只是查询等不修改实参,使用对象本身.)
int StackLen(sqStack s)
{return (s.top - s.base);
}//函数功能:清空栈
//参数 *s :栈对象地址
void ClearStack(sqStack *s)
{s->top = s->base;
}//函数功能:销毁栈
//参数 *s :栈对象地址
void DestoryStack(sqStack *s)
{int i, len;len = s->stackSize;for (i = 0; i < len; i++){free(s->base); //从栈底逐数据释放 s->base++;}s->top = s->base = NULL;s->stackSize = 0;
}//函数功能:十六进制转换
//参数 c  :待转换成十六进制表示的字符
char ToHexChar(char c)
{switch (c){case 10:return 'A';case 11:return 'B';case 12:return 'C';case 13:return 'D';case 14:return 'E';case 15:return 'F';default:return c+48;  //字符‘0-9’转换到数字0-9 }
}int main()
{//1.二进制转换成十进制/*ElemType c;sqStack s;int len, i, sum = 0;InitStack(&s);printf("输入二进制数 以#结束! \n");scanf("%c",&c);  //每次从键盘缓存区只读一个字符while (c != '#'){Push(&s, c);scanf("%c",&c);}getchar();  //把‘\n’从缓存区中去掉len = StackLen(s);printf("二进制栈当前容量为:%d  \n",len);for (i = 0; i < len; i++){Pop(&s, &c);sum = sum + (c - 48)*pow(2, i);}printf("二进制转换成十进制为:%d  \n", sum);*///2.二进制转换成八进制/*ElemType c;sqStack s, sOct;int   len, lenOct, i, temp = 0;InitStack(&s);InitStack(&sOct);printf("输入二进制数 以#结束! \n");scanf("%c", &c);  //每次从键盘缓存区只读一个字符while (c != '#'){Push(&s, c);scanf("%c", &c);}getchar();  //把‘\n’从缓存区中去掉len = StackLen(s);printf("二进制栈当前容量为:%d  \n", len);int count = 0;for (i = 0; i < len; i++){Pop(&s, &c);temp = temp + (c - 48)*pow(2, count);count++;if (count == 3 || (s.top == s.base)){Push(&sOct, temp);  //低位放在栈底temp = 0;count = 0;}}lenOct = StackLen(sOct);printf("八进制栈当前容量为:%d  \n", lenOct);printf("二进制转换成八进制为:");for (i = 0; i < lenOct; i++){Pop(&sOct, &c);printf("%d", c);}*///3.二进制转换成十六进制///*ElemType c;sqStack s, sHex;int   len, lenHex, i, temp = 0;InitStack(&s);InitStack(&sHex);printf("输入二进制数 以 # 结束! \n");scanf("%c", &c);  //每次从键盘缓存区只读一个字符while (c != '#'){Push(&s, c);scanf("%c", &c);}getchar();  //把‘\n’从缓存区中去掉len = StackLen(s);printf("二进制栈当前容量为:%d  \n", len);int count = 0;for (i = 0; i < len; i++){Pop(&s, &c);temp = temp + (c - 48)*pow(2, count);count++;if (count == 4 || (s.top == s.base))   //与八进制的重要区别{Push(&sHex, temp);  //低位放在栈底temp = 0;count = 0;}}lenHex = StackLen(sHex);printf("十六进制栈当前容量为:%d  \n", lenHex);printf("二进制转换成十六进制为:");char tempChar;for (i = 0; i < lenHex; i++){Pop(&sHex, &c);tempChar = ToHexChar(c);printf("%c", tempChar);}//*/return 0;
}

3.结果

线性表_使用栈实现二进制转换到八进制/十进制/十六进制相关推荐

  1. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  2. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

  3. 简单的利用栈 将二进制转换成十六进制

    将刚刚的二进制转换成八进制的程序改改就行了,如果有能读懂刚刚程序的人,这个so easy 就是换几个数,我就不多解释了 #include <stdio.h> #include <st ...

  4. python十六进制转换成八进制_Python 进制转换 二进制 八进制 十进制 十六进制

    全局定义一定不要丢了 全局定义 base = [str(x) for x in range()] + [ chr(x) for x in range(ord('A'),ord('A')+)] 二进制 ...

  5. 二进制 八进制 十进制 十六进制

    2->8:从个位开始把二进制数三个一组分组,然后每组分别换成8进制, 例:11,101,100 就是分组后的结果 11->3 101->5 100->4 所以结果是354 8- ...

  6. 【笔记】二进制八进制十进制十六进制互转详细教程和范例

    最近复习之前的笔记基础.又把进制转换理解了一遍.放在这里以后备查.同时作为分享. 二进制转换八进制十进制十六进制 例: 11010 二进制转换八进制 需要2进制数字为每3位分组的十进制数,不足3位的倍 ...

  7. 数据结构~~~线性表复习(栈的应用)

    // 线性表(栈的应用).cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include"iostream" #incl ...

  8. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  9. mysql 线性表_数据结构之线性表

    概要 参考<大话数据结构>,把常用的基本数据结构梳理一下. 线性表 定义 线性表(List):零个或多个数据元素的有限序列. 若将线性表记为 \((a_1, \cdots, a_{i-1} ...

  10. Java数据结构与算法_线性表_顺序表与链表

    文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...

最新文章

  1. 获取后台集合并遍历_java集合类汇总,终于出总结了,再也不用担心混淆了
  2. CentOS安装Oracle全过程
  3. (深入理解)强化学习中on policy和off policy的区别
  4. TCP超时与重传机制与拥塞避免
  5. jFreeChary初探
  6. Reflection in .net
  7. 多模光纤收发器的应用领域及适用领域
  8. c# 从地址拷贝byte_面试必备的 “零拷贝” 问题!从头给你说!
  9. Window中显示文件扩展名
  10. C语言 顺时针打印矩阵(二维数组)
  11. 黑群晖 断电 检测有bad sector_金属你不会以为回收就能直接再用吧,不是的,这些再生金属材料检测知识,很少人知道...
  12. 第4次作业类测试代码 021
  13. Spring Framework 4.0 M1: WebSocket 支持
  14. 全国医疗机构勒索病毒事件公告:阿里云发布公益行动
  15. CP2102 USB转串口驱动下载
  16. python与数据思维基础网课答案_智慧树知到_Python数据分析与数据可视化_答案免费查询...
  17. 如何在电脑端同时登录多个企业微信或微信
  18. 计算机学情分析万能模板,计算机教学计划5篇精选范文总结大全
  19. 一路狂奔的“幸运咖”,再造下一个“蜜雪冰城”?
  20. pyecharts源码解读(10)渲染包render之templates目录:渲染模板

热门文章

  1. 用.NET编程风格实现Ajax——Atlas快速入门
  2. 2019年7月19日星期五(交叉编译工具)
  3. Migrations有两个文件迁移数据的方法
  4. 大白话5分钟带你走进人工智能-第二节概率基础及高斯分布
  5. day4_监控日志的脚本
  6. ocRuntime基本功
  7. maven远程私服发布jar包
  8. PHPCMS V9 学习总结
  9. 3-单一职责原则+4-开放封闭原则+5依赖倒转原则
  10. 整合Solr到Tomcat服务器,并配置IK分词