数据结构-栈之二进制转十进制和八进制
栈满则后进先出原则,我们可以利用此特性实现二进制转十进制、二进制转八进制、二进制转十六进制等相关操作,废话不多说,直接上代码。
二进制转十进制:
//
// 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;
}
注:以上代码为个人的拙见,存在不足之处,还请大家多多海涵!
数据结构-栈之二进制转十进制和八进制相关推荐
- C++ 二进制、十进制、八进制和十六进制 转换
在C++中,默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制.但是二进制没有默认的输出 ...
- 第1关:利用栈实现整数的十进制转八进制
#ifndef stack__h #define stack__h#include <stdio.h> #include <stdlib.h>typedef int T; // ...
- 二进制与十进制、八进制、十六进制相互转换,八进制与十六进制以二进制为跳板转换(8421法则)
C语言中相关进制表示: 十进制 以正常数字1-9开头,如123 八进制 以数字0开头,如0123 十六进制 以0x开头,如0x123 二进制 C语言不能直接书写二进制数 1. 二进制与十进制相互转换 ...
- 0x4DC0 是一个十六进制数,它对应的 Unicode 编码是中国古老的《易经》六十四卦的第一卦,请输出第 51 卦(震卦)对应的 Unicode 编码的二进制、十进制、八进制和十六进制格式。
题目:0x4DC0 是一个十六进制数,它对应的 Unicode 编码是中国古老的<易经>六十四卦的第一卦,请输出第 51 卦(震卦)对应的 Unicode 编码的二进制.十进制.八进制和十 ...
- 数据类型的划分和进制之间的转换方式(二进制,十进制,八进制,十六进制)
数据类型的划分 值类型(13种) 值存储在堆栈中 存储空间小 调用速度快 a. 值类型变量可以直接分配给一个值.它们是从类 System.ValueType 中派生的. b. 值类型直接存储其值 c. ...
- 栈实现 —— 二进制转换为十进制
二进制转换为十进制 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath& ...
- 二进制换算十进制、八进制和十六进制。
27转换成二进制: 27每次除以2的余数一直除到最后的余数都是01的形式,倒过来看,就是换算后的二进制数. 二进制换算十进制:1111=1*2(0)+1*2(1)+1*2(2)+1*2(3)=1+ ...
- 十进制进制法_关于二进制、十进制、八进制、十六进制数据转换计算方法详细总结...
下面在安静的音乐中,让我们开始学习吧 公式库网 03:40来自生活用电 在我们接触编程知识时,总会接触有关进制转换的知识,最常见的就是10进制与二进制或十六进制之间的转换,很多时候我们总会遗忘,虽然现 ...
- 【数字电路基础】进制转换:二进制、十进制、八进制、十六进制、反码、补码、原码
文章目录 一.无符号数进制转换 1.1.十进制转二.八.十六 1.1.1. 十进制转二进制 1.1.2. 十进制转八进制 1.1.2. 十进制转十六进制 1.2.二.八.十六转十进制 1.3 二进制转 ...
最新文章
- 【Qt】重新认识QObject
- 【PAT乙级】1082 射击比赛 (20 分)
- springboot项目启动后无法访问index.html首页
- python requests cookies请求_python+requests实现接口测试 - cookies的使用
- 详解 height 和 width 属性
- 缓存淘汰算法--LRU算法
- add file in debian/source/include-binaries if you want to store the modified binary in the debian
- (转)老男孩教育每日一题-汇总博客
- 数据结构与算法 - 图论
- springboot毕业设计 基于springboot房产中介预约看房系统毕业设计设计与实现参考
- python冒泡算法_python冒泡算法
- 用python证明给定范围的欧拉常数
- vwf活性_血管性血友病因子(VWF)应该针对血型设置参考范围吗?
- Java中的statis用法
- 用户画像之概念知识!
- vue点击按钮打开新页签,并传参
- UVA, 10286 Trouble with a Pentagon
- 计算机初学者的干货(写的非常好本人推荐)
- c语言程序和数据是可执行,C语言学习笔记(C编程-Tan Haoqiang)
- OpenCV—Python 相似图像搜索算法
热门文章
- 使用MailMessage.AlternateViews时遇到的小问题
- Javascript设计模式
- QT5 动态链接库的创建和使用
- 配置View桌面时找不到域的解决方法
- PayPal Agility with Stability On OpenStack
- Backup Exec for Windows Servers (BEWS) 简体中文文档汇总(持续更新)
- C#系列五《程序的分支》
- mysqldump死住(实际是导致mysqld crash)
- EL表达式 jsp2.0 jsp1.2 与 tomcat
- Java:重写equals()和hashCode() 1