万能进制转换器——栈应用
万能进制转换器——栈应用
- 前言
- 一、设计思路
- 1、字符串和数字通过ASCII码来转换
- 2、先将用户输入的数字转换为10进制,再由10进制转为其他进制
- 二、具体步骤的实现
- 1、准备步骤
- 1、执行步骤
- (1) AllToTen函数:将所有进制转为10进制
- (1) TenToAllAndDisplay函数:将10进制转为特定的进制
- 三、效果展示
- 1、主函数运行起来
- 2、二进制转八进制
- 3、10进制转16进制
- 4、来个2进制转19进制QAQ
- 总结
- 附录:全部代码
前言
在学习严蔚敏的《数据结构》(C语言版),在栈的应用这一章:算法3.1,是一个非常简洁而强大的进制转换算法,它体现了栈最根本的性质:后进先出即符合计算机内部存储结构,又可以解决数学中的一些问题。这篇是根据算法3.1的扩充和改变使其可以任意转换:2到35进制的数。
一、设计思路
1、字符串和数字通过ASCII码来转换
因用户输入什么进制的数是不确定的所以我们用一个字符串数组来储存用户输入的数字或字母(大于9的数字用A(10),B(11)……来表示),然后对比每个元素的Ascii码进行加减将其转换为用户本意输入的数字,如字符’0’到‘9’对应的Ascii码为48到57,所以只需判断字符串的一个元素是否在此区间,如果是再在它的Ascii码上减去48即为它所对应的数字,字母同理。
2、先将用户输入的数字转换为10进制,再由10进制转为其他进制
因为用户输入的进制不确定,而其他进制转为10进制有比较简单的转转换公式,而10进制转为其它进制同理。
其他进制转10进制
10进制转为其他进制(以二进制为例)
根据上两图的方法,将二进制可替换任意进制,达成万能进制的转换。
二、具体步骤的实现
1、准备步骤
一些定义
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define StackSize 5 // 最大空间数字存储量
#define StackSizeAdd 3//每次的空间增连
#define SElemTyep int //栈中元素的定义替换
一些变量的初始化、和相关的组件函数
typedef struct { //栈的结构SElemTyep* base;SElemTyep* top;int stacksize;
}SqStack;int InitStack(SqStack& S) { //初始化栈//创建一个空栈S.base = (SElemTyep*)malloc(StackSize * sizeof(SElemTyep)); //为兼容性这里的类型我们使用char,if (!S.base) exit(0); //判定分配内存失败S.top = S.base;S.stacksize = StackSize;return 1;
}int Push(SqStack &S, SElemTyep e) //插入元素入栈
{if (S.top - S.base >= S.stacksize) { //栈满,增加存储空间S.base = (SElemTyep*)realloc(S.base,(S.stacksize + StackSizeAdd) * sizeof(SElemTyep));if (!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += StackSizeAdd;}*S.top++ = e;return 1;
}int Pop(SqStack& S, SElemTyep& e) { //元素出栈,并返回该数据if (S.top == S.base) return 0;e = *--S.top;return 1;
}int StackEmpty(SqStack S) { //判断该栈是否为空if (S.base == S.top) return 1;else return 0;
}int StrLenght(char *temp) //测量数组的长度
{int i = 0;while (temp[i] != '\0') i++;return(i);
}
1、执行步骤
(1) AllToTen函数:将所有进制转为10进制
int AllToTen(char *temp,int before) //将所有进制转为10进制并返回该10进制的数
{ //temp为数组的首地址,before为数字转换前的机制(2到35进制)int flag; //用来存放传入数组的长度int num=0; //存放转换后10进制的数flag = StrLenght(temp);for (int i = flag-1; i >= 0; i--) {if(48<= temp[i]&& temp[i] <=57 && temp[i] -48<before) //限定0到9字符的范围{num += (temp[i] - 48) * (int)pow(before, flag - i-1); //进行10进制转换}else if (65 <= temp[i] && temp[i] <= 90 && temp[i] - 55 < before) //限定A到Z的范围{num += (temp[i] - 55) * (int)pow(before, flag - i - 1);}else if (97 <= temp[i] && temp[i]<= 122 && temp[i] - 87 < before) //限定a到z的范围{num += (temp[i] - 87) * (int)pow(before, flag - i - 1);}else{printf("\n\t输入的数字于进制不匹配,请重新输入");exit(0);}}return num;
}
(1) TenToAllAndDisplay函数:将10进制转为特定的进制
void TenToAllAndDisplay(int num,int now) //将10进制转为特定的进制,并输出到控制台
{ //num为十进制的整数,now为你想转换为的进制(2到35)SqStack S;InitStack(S); if (now > 35) exit(0); //最大只接受35进制。int insert=0; //存储插入栈中的数字while (num){insert = num % now;if (10 <= insert && insert<=35) insert += 55;/*printf("*%d*", insert);*/Push(S,insert);num = num / now;}printf("\n转换后的值:");while (!StackEmpty(S)){Pop(S, insert);if (65 <= insert && insert<= 90){printf("%c", insert);}else if (0 <= insert && insert<= 9){printf("%d", insert);}else exit(0) ;}printf("\n");
}
三、效果展示
1、主函数运行起来
int main()
{int before;int now;char temp[100];int num;printf("**********万能进制转换器***********\n");printf("\n转换前的进制:");scanf_s("%d", &before);printf("\n转换后的进制:");scanf_s("%d", &now);printf("\n请输入你想要转换的数:");scanf_s("%s", temp, 100); //接受用户输入的字符(为保证通用性接受字符后转换为普通的数字)TenToAllAndDisplay(AllToTen(temp, before), now); //运行
}
2、二进制转八进制
3、10进制转16进制
4、来个2进制转19进制QAQ
都看到这里了求一个免费的赞OVO
总结
看到这里是不是有点疑惑,为什么在任意进制转到10进制用数组,而在10进制转为特定进制用堆栈。其实在其他进制转为10进制中,逐位的乘以从零开始的进制幂数,从后往前乘这非常契合栈的性质—后进先出。但要知道数组和栈(尤其是这里定义的栈)本就是一体两面(数组就是有限定的特殊栈),所以即使用栈去写并不会降低其时间复制度,还可能出现char形栈在转成数字计算的麻烦。但使用栈的方法是完全可以的,有兴趣的小伙伴可以去尝试一下,也可以跟我私信或评论探讨一些(博主太懒不愿再写了ヾ( ̄▽ ̄)ByeBye)
附录:全部代码
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define StackSize 5 // 最大空间数字存储量
#define StackSizeAdd 3//每次的空间增连
#define SElemTyep int //栈中元素的定义替换typedef struct { //栈的结构SElemTyep* base;SElemTyep* top;int stacksize;
}SqStack;int InitStack(SqStack& S) { //初始化栈//创建一个空栈S.base = (SElemTyep*)malloc(StackSize * sizeof(SElemTyep)); //为兼容性这里的类型我们使用char,if (!S.base) exit(0); //判定分配内存失败S.top = S.base;S.stacksize = StackSize;return 1;
}int Push(SqStack &S, SElemTyep e) //插入元素入栈
{if (S.top - S.base >= S.stacksize) { //栈满,增加存储空间S.base = (SElemTyep*)realloc(S.base,(S.stacksize + StackSizeAdd) * sizeof(SElemTyep));if (!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += StackSizeAdd;}*S.top++ = e;return 1;
}int Pop(SqStack& S, SElemTyep& e) { //元素出栈,并返回该数据if (S.top == S.base) return 0;e = *--S.top;return 1;
}int StackEmpty(SqStack S) { //判断该栈是否为空if (S.base == S.top) return 1;else return 0;
}int StrLenght(char *temp) //测量数组的长度
{int i = 0;while (temp[i] != '\0') i++;return(i);
}int AllToTen(char *temp,int before) //将所有进制转为10进制并返回该10进制的数
{ //temp为数组的首地址,before为数字转换前的机制(2到35进制)int flag; //用来存放传入数组的长度int num=0; //存放转换后10进制的数flag = StrLenght(temp);for (int i = flag-1; i >= 0; i--) {if(48<= temp[i]&& temp[i] <=57 && temp[i] -48<before) //限定0到9字符的范围{num += (temp[i] - 48) * (int)pow(before, flag - i-1); //进行10进制转换}else if (65 <= temp[i] && temp[i] <= 90 && temp[i] - 55 < before) //限定A到Z的范围{num += (temp[i] - 55) * (int)pow(before, flag - i - 1);}else if (97 <= temp[i] && temp[i]<= 122 && temp[i] - 87 < before) //限定a到z的范围{num += (temp[i] - 87) * (int)pow(before, flag - i - 1);}else{printf("\n\t输入的数字于进制不匹配,请重新输入");exit(0);}}return num;
}void TenToAllAndDisplay(int num,int now) //将10进制转为特定的进制,并输出到控制台
{ //num为十进制的整数,now为你想转换为的进制(2到35)SqStack S;InitStack(S); if (now > 35) exit(0); //最大只接受35进制。int insert=0; //存储插入栈中的数字while (num){insert = num % now;if (10 <= insert && insert<=35) insert += 55;/*printf("*%d*", insert);*/Push(S,insert);num = num / now;}printf("\n转换后的值:");while (!StackEmpty(S)){Pop(S, insert);if (65 <= insert && insert<= 90){printf("%c", insert);}else if (0 <= insert && insert<= 9){printf("%d", insert);}else exit(0) ;}printf("\n");
}int main()
{int before;int now;char temp[100];int num;printf("**********万能进制转换器***********\n");printf("\n转换前的进制:");scanf_s("%d", &before);printf("\n转换后的进制:");scanf_s("%d", &now);printf("\n请输入你想要转换的数:");scanf_s("%s", temp, 100); //接受用户输入的字符(为保证通用性接受字符后转换为普通的数字)TenToAllAndDisplay(AllToTen(temp, before), now); //运行
}
万能进制转换器——栈应用相关推荐
- 寒假用C写了个“万能进制转换器”
漫漫的寒假是无聊的,在家没事,遍用C写了个"万能进制转换器"的小程序,虽然叫万能,但还是不能转换带小数点的.没办法,新手嘛,能力有限·····望大家不要见笑..有兴趣的我们一 ...
- C#底层库--万能进制转换器(自定义有序字符,支持任意进制)
系列文章 C#底层库–RegexHelper正则表达式辅助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286 C#底层 ...
- 进制转换器——章节实验作业(C语言链栈)
进制转换器--章节实验作业 [问题描述]十进制数N和其他d进制数的转换是计算机实现计算的基本问题.通常我们可以使用短除法进行转换,基本原理为:N=(N div d)*d+N mod d(其中:div为 ...
- 数据结构之进制转换器实现
进制转换器项目要求:用户提供需要转换的数据和该数据的进制,以及要转换的进制,进制转换器提供给用户最终的正确转换的结果. 转换器实例 例如,用户提供了一个十进制数:10,要求将此数据以二进制形式转换,则 ...
- C++实现数字进制转换器
C++实现数字进制转换器 刷题中遇到一些进制转化的题目,由于从十进制转化为其他进制(十以内)方法完全相同,因此总结为一个进制转换器作为练习,当作一个练习记录.代码没有经过优化,请诸位大佬轻喷. 十进制 ...
- 用java编写进制转换器_JAVA 简单进制转换器
JAVA作业写了个进制转换器...写出来的东西还蛮怪的 /* * Author:graykido * Coding:GBK * */ package Caculater; import javafx. ...
- java进制转换界面,java进制转换器 图形用户界面 十进制及其相反数诀别转化为二,四,八,十六进制...
java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制 package com.rgy.Test; import java.awt.Color; import java.aw ...
- android进制之间的转换器,一个Android平台的16进制转换器
<一个Android平台的16进制转换器>由会员分享,可在线阅读,更多相关<一个Android平台的16进制转换器(1页珍藏版)>请在人人文库网上搜索. 1.一个An droi ...
- C++ 进制转换器:二进制、十进制、十六进制
做了一个C++进制转换器,支持10转2.10转16.2转10.16转10.10转2.2转16,解析都写在代码里哦! #include <bits/stdc++.h> using names ...
最新文章
- cann't connect to db! mysql!,解决SQL Error: Can't connect to MySQL server on错误
- 鸿蒙10.1升级机型,鸿蒙系统的前奏,华为EMUI10.1从底层掏空安卓,20款老机型升级...
- 使用示例_在Unity中使用ComputeShader示例
- 基于SpringBoot+Vue前后端分离管理系统
- python3多进程写时拷贝_Python实现多进程的详解(附示例)
- C++静态数据成员和静态成员函数
- 【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)
- CronTrigger表达式
- Python数据去重
- 从 iTunes 和 Finder 断开 iPhone 连接的三种方法
- 拍拍贷魔镜杯风控算法大赛项目
- 树莓派安装opencv3.4.3时缺少boostdesc等文件及一些常见的报错
- CentOS安装配置freeIPA
- Unity3d实现开机自启App
- 为什么苹果4s用电信卡显示无服务器,电信4G卡插入苹果4S,提示“无服务”
- 主题包网址(Theme)
- Linux中使用gzip来压缩/解压 *.gz文件
- 一句话的结束!句号问号叹号
- 六年级上册计算机期末试题及答案,小学六年级上册数学期末检测试题
- 球差电镜测试常见的问题及解答(一)