因为需要应试的原因需要刷刷C,在大家的推荐下,选用了《C程序设计语言》Brain等著的版本。今天在刷第四章的时候,学习了逆波兰式计算器,书上代码及我的注释如下,心得跟在后面。

#include<stdio.h>
#include<stdlib.h>#define MAXOP 100  //这个是最大一次输入的长度
#define NUMBER '0' //一个标志,意味着接收到的是数字,换成其他也无妨int getop(char[]);//声明函数,分别是获取一个有意义的值、入栈、出栈
void push(double);
double pop(void);main(){int type;//标注每一个获取到的有意义值的类型,如数字,运算符,空格,=double op2;//临时储存变量,储存并验证被除数和被减数等需要次序的运算数据char s[MAXOP];//用以储存单次输入的一个列表while((type=getop(s)) !=EOF){//只要输出的不是一个完整的EOF,这个循环就会持续调用getop录入数据switch(type){case NUMBER://如果是数字,getop函数将返回我们设定好的标志'0',则把s中的字符串转数字入栈push(atof(s));break;case '+'://加法运算和乘法运算都是提取出最近的两个值,计算后把结果入栈。push(pop()+pop());break;case '*':push(pop()*pop());break;case '-'://减法和除法,需要考虑除数不为0以及先后次序,再计算后入栈op2=pop();push(pop()-op2);break;case '/':op2=pop();if(op2!=0.0)push(pop()/op2);elseprintf("error:zero divisor\n");break;case'\n'://如果按下回车,则会出栈最后一位数据,并在屏幕上打印,多数情况下这就是计算结果printf("\t%.8g\n",pop());break;default://错误值报错printf("error:unknown command %s\n",s);break;}}return 0;
}#define MAXVAL 100 //栈 val的最大深度
int sp = 0;                 //下一个空栈位置
double val[MAXVAL]; //值栈val用于在计算中储存所有有效数据(不储存任何计算符号!)
//运算符号在被getop函数录入的同时,计算后的值就已经被录入到了val,且被肌酸的数也会出栈。// push 函数:把 f 压入值栈中,并把空栈位置后移(干净利落)
void push(double f)
{if(sp < MAXVAL)val[sp++] = f;elseprintf("栈已满不能压入 %g\n",f);
}
//pop 函数:弹出并返回栈顶!顶的值,也就是最后一位的值,同时把空栈标记前移
double pop(void)
{if(sp > 0)return val[--sp];else{printf("栈是空的\n");return 0.0;}
}//以下是获取下一个输入的函数#include<ctype.h>int getch(void);//这两个函数可以被称作是,“压入”和“释放”缓冲区
void ungetch(int);int getop(char s[]){//这个函数与缓冲区函数对接,筛选并返回出输入的有效结果,用于main()函数int i,c;while((s[0]=c=getch())==' '||c=='\t');//空格与tab是允许出现的非数字及运算符号,用于表示间隔,没有它们的话将无法分开多个连续数字。s[1]='\0';//探测到间隔符,但是根据实测,没必要增加结尾符,探测到空格则会自动结尾。if (!isdigit(c) && c!='.')return c; //非数字,直接返回,是否是合法符号main会探测。i=0;if(isdigit(c))while (isdigit(s[++i]=c=getch()));if(c == '.')while (isdigit(s[++i]=c=getch()));s[i]='\0';//数字的读取if(c!=EOF)//最后一位的缓冲,如果最后位非数字,则不应该随数字一起录入,否则会造成遗漏。ungetch(c);//删掉这句,例如 1 2+ 的写法将无法读取到+。按格式写的话这句的确无用。return NUMBER;
}#define BUFSIZE 100
//缓冲区char buf[BUFSIZE];
int bufp=0;//取一个字符,可能是压回的运算符或者其他符号。
int getch(void){return (bufp>0)?buf[--bufp]:getchar();
}void ungetch(int c){if(bufp>=BUFSIZE)printf("ungetch:too many characters\n");elsebuf[bufp++]=c;
}

代码很优秀,唯一需要注意的就是要按照逆波兰式写法输入数据。

C程序设计语言逆波兰式计算器学习心得相关推荐

  1. c语言逆波兰式算法,c语言 逆波兰式输入 计算器程序

    #include #include #include #define MAXOP 100 #define NUMBER '0' int getop(char []) ; void push(doubl ...

  2. 【C语言】算法学习·逆波兰式

    目录 逆波兰式 算法定义 算法作用 算法实现 计算方法 算法举例 算法图示 程序实现 二叉树法 逆波兰式 算法定义 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E ...

  3. C语言编程对一个逆波兰式进行求值,算式与逆波兰式

    致憨憨的从前 当年,老师布置一道作业:编写一个计算器,要求输入算式,给出结果.算式中只包含+-*/^这几个运算符,算式中不含负数.由于是Python课程,我很快给出了解题方式,如下: while Tr ...

  4. c语言int 转bool_C++代码实现逆波兰式_C 语言

    100行以内C++代码实现逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后). 算术表达式转逆波兰式例子: 逆波兰式整 ...

  5. 逆波兰式是什么(以及dc计算器如何使用)

    最近看文档看到逆波兰式(Reverse Polish notation或者reverse-polish,RPN)就去查询了一下.如果需要较为详细的解释看这个链接:https://mathworld.w ...

  6. c语言数据结构逆波兰算法,[分享]表达式二叉树逆波兰式的转换程序源代码(C++)...

    [分享]表达式二叉树逆波兰式的转换程序源代码(C++) RT,这是我两年前学数据结构时的作品. 拿出来给大家分享. ps:当时才学C++,代码写的不好,见笑了./*将中缀式转换为表达式树,并打印逆波兰 ...

  7. 逆波兰式 java_Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析...

    Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...

  8. Perl实现逆波兰式与递归计算

      近一个学期都没有写过博客了,甚至CSDN也很少来了,有点想念这里了.大三忙的比高三还累,早八点出,晚十二点归,弄得自己都不知道是在读大学还是在工作.另一方面兴趣也逐渐转移了,对纯软件没有以前那样着 ...

  9. 中缀表达式转换成逆波兰式

    栈的应用:中缀表达式转换成逆波兰式 小白前来报道!懒癌患者的第一篇博客,实属不易,先为自己鼓个掌. 编写程序,将任意一个合法的中缀表达式转换成逆波兰式. [问题描述]表达式计算是实现程序设计语言的基本 ...

  10. 编译原理——逆波兰式分析计算

    一.实验目的 将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值. 二.实验说明 1.逆波兰式定义 将运算对象写在前面,而把运算符号写在后面.用这 ...

最新文章

  1. macos windowserver占用内存_【v007】如何安装MAC OS的虚拟机系统(上)
  2. BugKuCTF 杂项 宽带信息泄露
  3. Java 环形缓冲器(Ring Buffer)
  4. 深入理解PHP之源码目录结构
  5. linux 系统配置
  6. matlab仿真限幅发散,GSM通信系统性能分析与MATLAB仿真.doc
  7. ElementUI:navmenu导航中,开启vue-router 的模式后,点击触发事件而不进行路由跳转
  8. Servlet的原理是什么?
  9. 定点数乘法运算:Booth算法(补码一位乘法)C 实现
  10. QT菜单栏颜色与背景颜色设置
  11. 哞力无法挡 516争抢最后一群斐讯“天天牛”
  12. [渝粤教育] 天津师范大学 中学地理教学设计 参考 资料
  13. java爬取今日头条_今日头条抓取街拍图片数据集
  14. UML stereotype
  15. 魔兽世界服务器显示新,《魔兽世界》怀旧服再开新服,背后的原因竟然是!
  16. 微软挑战人工智能的下一个大战场:人类的永续未来
  17. 计算机无法识别fat32,电脑无法识别USB设备的原因及处理方法
  18. 查看linux下oracle安装位置
  19. HTML图片打开新窗口
  20. 【RK3399】[Android 6.0] linux4.4 调试8723BU记录过程

热门文章

  1. flv格式怎么转换成mp4?视频格式转换步骤详解
  2. php 判断时间是星期几,通过PHP的date()函数判断今天是星期几
  3. 在安装office2003时,出现安装程序包的语言不受系统支持的错误,如何解决?
  4. 最新wifi大师小程序独立版3.0.8源码
  5. 验证码识别平台哪个好?
  6. 奇迹mu修改服务器名,奇迹MU 红名设置调整方案说明
  7. Python大法之告别脚本小子系列—信息资产收集类脚本编写(下)
  8. 我来自江湖修改器|我来自江湖修改器3dm下载 v0.1二十四项
  9. python将pvr格式转换成pvr.ccz的代码
  10. 将MP4文件在网页端播放