栈满则后进先出原则,我们可以利用此特性实现二进制转十进制、二进制转八进制、二进制转十六进制等相关操作,废话不多说,直接上代码。

二进制转十进制:


//
// Created by Administrator on 2018/5/28.
////二进制转十进制#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>#define ElementType int
#define MaxSize 10定义栈的结构体
typedef struct {ElementType *top;//栈顶指针(这里定义为指向栈顶元素的下一个位置,即为空)ElementType *base;//栈底指针int stackSize;//栈的容量
} Stack;/***  初始化栈* @param s*/
void InitStack(Stack *s) {//初始化分配栈的总空间s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));if (!s->base) {//分配失败exit(0);}s->top = s->base;s->stackSize = MaxSize;
}/*** 入栈* @param s 栈* @param e 入栈元素*/
void Push(Stack *s, ElementType e) {//判断栈是否已满if (s->top - s->base >= s->stackSize) {//栈已满//处理方式1.递增空间 2.退出printf("栈已满~\n");exit(0);}*(s->top) = e; //赋值s->top++;
}/*** 出栈* @param s 栈* @return*/
ElementType Pop(Stack *s) {//判断栈是否为空if (s->base == s->top) {//栈为空printf("不好意思,栈目前为空~\n");exit(0);}s->top--;ElementType e = *(s->top);//取值,并不是取地址return e;
}/*** 释放栈* @param s*/
void FreeStack(Stack *s) {if (!s) {printf("栈空,不需要释放\n");} else {free(s->base);free(s);printf("栈释放完成~\n");}
}/*** 栈当前容量* @param s* @return*/
ElementType GetLen(Stack s) {int len = (s.top - s.base);return len;
}int main() {printf("二进制转十进制!\n");Stack stack;InitStack(&stack);int data[] = {1, 0, 1, 1, 0, 1};int length = sizeof(data) / sizeof(data[0]);  //数组占内存总空间,除以单个元素占内存空间大小int sum = 0;printf("二进制数据入栈\n");for (int i = 0; i < length; i++) {Push(&stack, data[i]);int e = Pop(&stack);printf("%d", e);sum = sum + e * pow(2, i);}printf("\n十进制结果=%d", sum);return 0;
}

二进制转八进制:

//
// Created by Administrator on 2018/5/28.
////二进制转八进制
//注:二进制转八进制是通过获取二进制中每三位数据计算一个八进制值,如果高位不足三位则通过补0的方式凑齐
#include <stdio.h>
#include <stdlib.h>
#include <math.h>#define ElementType int
#define MaxSize 10//定义栈的结构体
typedef struct {ElementType *top;//栈顶指针(这里定义为指向栈顶元素的下一个位置,即为空)ElementType *base;//栈底指针int stackSize;//栈的容量
} Stack;/***  初始化栈* @param s*/
void InitStack(Stack *s) {//初始化分配栈的总空间s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));if (!s->base) {//分配失败exit(0);}s->top = s->base;s->stackSize = MaxSize;
}/*** 入栈* @param s 栈* @param e 入栈元素*/
void Push(Stack *s, ElementType e) {//判断栈是否已满if (s->top - s->base >= s->stackSize) {//栈已满//处理方式1.递增空间 2.退出printf("栈已满~\n");exit(0);}*(s->top) = e; //赋值s->top++;
}/*** 出栈* @param s 栈* @return*/
ElementType Pop(Stack *s) {//判断栈是否为空if (s->base == s->top) {//栈为空//printf("\n不好意思,栈目前为空~\n");return -1;}s->top--;ElementType e = *(s->top);//取值,并不是取地址return e;
}/*** 释放栈* @param s*/
void FreeStack(Stack *s) {if (!s) {printf("栈空,不需要释放\n");} else {free(s->base);free(s);printf("栈释放完成~\n");}
}/*** 栈当前容量* @param s* @return*/
ElementType GetLen(Stack s) {int len = (s.top - s.base);return len;
}int main() {printf("二进制转八进制!\n");Stack stack, stack1;InitStack(&stack);InitStack(&stack1);int data[] = {1, 0, 1, 1, 0,1,0};int length = sizeof(data) / sizeof(data[0]);  //数组占内存总空间,除以单个元素占内存空间大小printf("二进制数据入栈~\n");for (int i = 0; i < length; i++) {printf("%d", data[i]);Push(&stack, data[i]);}//获取栈当前的长度int currentLen = GetLen(stack);int sum = 0;int k = 1;if (currentLen < 3) {//如果栈当前容量不足3位则补足3位currentLen = 3;} else {//如果当前栈容量为基数即不是3的倍数,则凑为3的倍数(方便接下来便利计算)int mod = currentLen % 3;if (mod != 0) {currentLen = currentLen + (3 - mod);}}for (int j = 0; j < currentLen; j++) {ElementType e = Pop(&stack);if (e == -1) {//如果二进制中不存在数据(说明该栈不是3的倍数),通过高位补0的方式处理e = 0;if (k % 3 != 0) {k++;} else{sum = sum + e * pow(2, k - 1);Push(&stack1, sum);}} else {//二进制栈中存在数据,按取3位计算一次,然后入八进制栈sum = sum + e * pow(2, k - 1);if (k % 3 == 0) {Push(&stack1, sum);sum = 0;k = 1;continue;}k++;}}int s2Len = GetLen(stack1);printf("\n八进制结果数据出栈:\n");for (int l = 0; l < s2Len; l++) {ElementType e = Pop(&stack1);printf("%d", e);}return 0;
}

注:以上代码为个人的拙见,存在不足之处,还请大家多多海涵!

数据结构-栈之二进制转十进制和八进制相关推荐

  1. C++ 二进制、十进制、八进制和十六进制 转换

    在C++中,默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制.但是二进制没有默认的输出 ...

  2. 第1关:利用栈实现整数的十进制转八进制

    #ifndef stack__h #define stack__h#include <stdio.h> #include <stdlib.h>typedef int T; // ...

  3. 二进制与十进制、八进制、十六进制相互转换,八进制与十六进制以二进制为跳板转换(8421法则)

    C语言中相关进制表示: 十进制 以正常数字1-9开头,如123 八进制 以数字0开头,如0123 十六进制 以0x开头,如0x123 二进制 C语言不能直接书写二进制数 1. 二进制与十进制相互转换 ...

  4. 0x4DC0 是一个十六进制数,它对应的 Unicode 编码是中国古老的《易经》六十四卦的第一卦,请输出第 51 卦(震卦)对应的 Unicode 编码的二进制、十进制、八进制和十六进制格式。

    题目:0x4DC0 是一个十六进制数,它对应的 Unicode 编码是中国古老的<易经>六十四卦的第一卦,请输出第 51 卦(震卦)对应的 Unicode 编码的二进制.十进制.八进制和十 ...

  5. 数据类型的划分和进制之间的转换方式(二进制,十进制,八进制,十六进制)

    数据类型的划分 值类型(13种) 值存储在堆栈中 存储空间小 调用速度快 a. 值类型变量可以直接分配给一个值.它们是从类 System.ValueType 中派生的. b. 值类型直接存储其值 c. ...

  6. 栈实现 —— 二进制转换为十进制

    二进制转换为十进制 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath& ...

  7. 二进制换算十进制、八进制和十六进制。

    27转换成二进制:   27每次除以2的余数一直除到最后的余数都是01的形式,倒过来看,就是换算后的二进制数. 二进制换算十进制:1111=1*2(0)+1*2(1)+1*2(2)+1*2(3)=1+ ...

  8. 十进制进制法_关于二进制、十进制、八进制、十六进制数据转换计算方法详细总结...

    下面在安静的音乐中,让我们开始学习吧 公式库网 03:40来自生活用电 在我们接触编程知识时,总会接触有关进制转换的知识,最常见的就是10进制与二进制或十六进制之间的转换,很多时候我们总会遗忘,虽然现 ...

  9. 【数字电路基础】进制转换:二进制、十进制、八进制、十六进制、反码、补码、原码

    文章目录 一.无符号数进制转换 1.1.十进制转二.八.十六 1.1.1. 十进制转二进制 1.1.2. 十进制转八进制 1.1.2. 十进制转十六进制 1.2.二.八.十六转十进制 1.3 二进制转 ...

最新文章

  1. 【Qt】重新认识QObject
  2. 【PAT乙级】1082 射击比赛 (20 分)
  3. springboot项目启动后无法访问index.html首页
  4. python requests cookies请求_python+requests实现接口测试 - cookies的使用
  5. 详解 height 和 width 属性
  6. 缓存淘汰算法--LRU算法
  7. add file in debian/source/include-binaries if you want to store the modified binary in the debian
  8. (转)老男孩教育每日一题-汇总博客
  9. 数据结构与算法 - 图论
  10. springboot毕业设计 基于springboot房产中介预约看房系统毕业设计设计与实现参考
  11. python冒泡算法_python冒泡算法
  12. 用python证明给定范围的欧拉常数
  13. vwf活性_血管性血友病因子(VWF)应该针对血型设置参考范围吗?
  14. Java中的statis用法
  15. 用户画像之概念知识!
  16. vue点击按钮打开新页签,并传参
  17. UVA, 10286 Trouble with a Pentagon
  18. 计算机初学者的干货(写的非常好本人推荐)
  19. c语言程序和数据是可执行,C语言学习笔记(C编程-Tan Haoqiang)
  20. OpenCV—Python 相似图像搜索算法

热门文章

  1. 使用MailMessage.AlternateViews时遇到的小问题
  2. Javascript设计模式
  3. QT5 动态链接库的创建和使用
  4. 配置View桌面时找不到域的解决方法
  5. PayPal Agility with Stability On OpenStack
  6. Backup Exec for Windows Servers (BEWS) 简体中文文档汇总(持续更新)
  7. C#系列五《程序的分支》
  8. mysqldump死住(实际是导致mysqld crash)
  9. EL表达式 jsp2.0 jsp1.2 与 tomcat
  10. Java:重写equals()和hashCode() 1