C语言:数据结构-数制转换与表达式求值
liebian365 2024-10-18 09:31 26 浏览 0 评论
1.数制转换
数值进位制的换算是计算机实现计算和处理的基本问题。比如将十进制数m转换为n进制的数,最常用的算法是除n取余法。这种方法是将十进制数m每次除以n,直到商为0时为止。将所得的余数依次进栈,然后按“后进先出”的次序出栈便得到转换结果。其基本原理是:
m=(m / n)* n + m % n ( 其中: / 为整除,%为求余 )
例 将十进制数1567转换为八进制数。
设m=1567 ,n=8。按照除8取余法,转换方法和结果如下:
按照上述除8取余法,得到的余数依次是7,3,0,3。在转换过程中每得到一个余数则进栈保存,最先得到的余数7在栈底,最后得到的余数3在栈顶,转换完毕后依次出栈,其输出顺序与计算顺序正好相反,为3、0、3、7。数值3037即为转换后的八进制数,可表示为:
(1567)10 =(3037)8
将十进制数转换为n进制数的过程中,计算顺序与输出顺序正好相反。因此,利用栈解决这个问题是很合适的。
算法原理:
(1)逐次计算得到相关结果,先计算得到的结果后输出;
(2)把逐次得的余数依次进栈,计算结束后依次出栈。
算法要点(采用顺序栈):
(1)m!=0 ,m%n 的余数进栈;
若m==0,结束求余运算,依次进行出栈操作;
(2)m=m/n;
(3)重复(1)和(2)。
利用顺序栈将任意的十进制非负整数转换为等价的n进制数输出的完整程序如下 :
#include<stdio.h> #include<stdlib.h> #define MaxSize 100 /*定义顺序栈所能存储的最多的元素的个数*/ typedef int ElemType; /*数据元素类型一般用ElemType表示*/ struct SeqStack{ /*顺序栈的类型定义*/ ElemType data[MaxSize]; /*用data数组存储栈中所有的数据元素*/ int top; /*用整型变量top指示栈顶元素的位置*/ }; #include "顺序栈基本操作.c" /*顺序栈的6种运算包含在此文件中*/ void transform(int m, int n) /*将一个十进制整数m转换为n进制数输出函数*/ { int k; /*用来保存余数*/ int mm=m; /*用来保存被转换的十进制数m*/ struct SeqStack S; /*顺序栈的变量定义*/ InitStack(&S); /*将顺序栈a初始化*/ while(m!=0) { k=m%n; /*将十进制数m除以n进制数的余数存入k*/ Push(&S,k); /*将k的值进栈a中*/ m=m/n; /*用m除以n的整数商又赋给m*/ } printf("十进制数 %d 转换为 %d 进制数为:",mm,n); while(!StackEmpty(&S)) { /*元素依次出栈 */ k=Pop(&S,k); printf("%d",k); } printf("\n"); }/*transform end*/ void main() { printf("将十进制数转换为任意进制数实例:\n"); transform(1567,8); /*将十进制数转换为八进制数 */ transform(1567,6); /*将十进制数转换为六进制数 */ transform(1567,4); /*将十进制数转换为四进制数 */ transform(1567,2); /*将十进制数转换为二进制数 */ } 上机运行该程序后,得到的运行结果如下: 将十进制数转换为任意进制数实例: 十进制数 1567 转换为 8 进制数为:3037 十进制数 1567 转换为 6 进制数为:11131 十进制数 1567 转换为 4 进制数为:120133 十进制数 1567 转换为 2 进制数为:11000011111
2.表达式的求值
后缀表达式的求值比较简单,扫描一遍即可完成。具体做法是:设置一个栈,开始时栈为空,当从左到右扫描表达式时,若遇到操作数,则进栈,若遇到运算符,则从栈中退出两个操作数,先退出的放在运算符的右边,后退出的放在运算符的左边,然后将运算后的结果再进栈,直到整个表达式结束。此时,栈中只有一个元素,该元素即为运算结果。
例 求后缀表达式12 3 20 4/ * 8-6 * +的值。
栈的变化情况如表3-1所示:
表3-1 后缀表达式求值时栈的变化
后缀表达式的求值算法
int Compute(char * str) /*计算由str所指字符串的后缀表达式的值*/ { /*用顺序栈S存储操作数和中间计算结果,元素类型为int*/ struct SeqStack S; /*定义x用于保存操作数,定义i用于扫描后缀表达式*/ int x; int i=0; InitStack(&S); /*初始化栈S,预分配5个浮点数空间,以后自动增长*/ while(str[i]) { /*扫描后缀表达式中的每个字符,并进行相应处理*/ if(str[i]==' ') {i++; continue;} /*扫描到空格字符不做任何处理*/ switch(str[i]) { case '+': /*做栈顶两个元素的加法,和赋给x*/ x=Pop(&s)+Pop(&S); i++; break; case '-': /*做栈顶两个元素的减法,差赋给x*/ x=Pop(&S); /*弹出减数*/ x=Pop(&S)-x; /*弹出被减数并做减法*/ i++; break; case '*': /*做栈顶两个元素的乘法,积赋给x*/ x=Pop(&S)*Pop(&S); i++; break; case '/': /*做栈顶两个元素的除法,商赋给x*/ x=Pop(&S); /*弹出除数*/ if(x!=0.0) x=Pop(&S)/x; /*弹出被除数并做除法*/ else { /*除数为0时终止运行*/ printf("除数为0!\n"); exit(1); } i++; break; default: /*扫描到的是整数字符串,生成对应的整数*/ x=0; /*利用x保存扫描到的整数*/ while(str[i]>=48 && str[i]<=57) { x=x*10+str[i]-48; i++; } } Push(&S,x); /*把扫描转换后或进行相应运算后得到的整数压入栈S中*/ } /*while end*/ if(StackEmpty(&S)) { /*若计算结束后栈为空则中止运行*/ printf("后缀表达式格式错!\n"); exit(1); } /*若栈中仅有一个元素,则它就是后缀表达式的值,否则为出错*/ x=Pop(&S); if(StackEmpty(&S)) return x; else { printf("后缀表达式格式错!\n"); exit(1); } }
相关推荐
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
-
明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
-
首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
-
齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...
- Qt界面——搭配QCustomPlot(qt platform)
-
这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
-
老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
-
用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
-
前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...
- 掌握Visual Studio项目配置【基础篇】
-
1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
-
随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...
- Visual Studio Community 2022(VS2022)安装图文方法
-
直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...
- Qt添加MSVC构建套件的方法(qt添加c++11)
-
前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...
- Qt为什么站稳c++GUI的top1(qt c)
-
为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...
- qt开发IDE应该选择VS还是qt creator
-
如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...
- Qt 5.14.2超详细安装教程,不会来打我
-
Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...
- Cygwin配置与使用(四)——VI字体和颜色的配置
-
简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)