小白写逆波兰计算器

2023-11-12

/*逆波兰计算器:淮南师范学院 电子工程学院 夏健钧 2017/3/24*/
/*逆波兰计数法:参考维基百科*/
#include<stdio.h>
#include<stdlib.h>  /*为了使用atof()函数*/
#include<ctype.h>
#define MAXOP 100   /*操作数或运算符的最大长度*/
#define NUMBER '0'  /*标识找到一个数*/

int getop (char [] );
void push (double);
double pop (void);

/* 逆波兰计算器 */
int main(int argc, const char *argv[])
{
 int type;
 double op2;
 char s[MAXOP];


 while ((type = getop(s)) != EOF)
 {
  switch (type)
  {
   case NUMBER:
     push(atof(s)); /*atof(s):将字符串(s)转换为双精度的浮点数据*/
     break;
   case '+':
       push(pop() + pop()); /*先弹出并返回栈顶的值,将两值相加后,压到栈底*/
       break; 
   case '*':
       push(pop() * pop()); /*先弹出并返回栈顶的值,将两值相乘后,压到栈底*/
       break; 
   case '-':            /* 因 * / 不满足交换律 需要考虑弹出的次序*/
       op2 = pop ();  /*将先输入的值赋值给op2,后输入的值减去op2,将结果压入栈底*/
       push(pop() - op2);
       break;

   case '/':
       op2 = pop ();  /* 将先输入的值赋值给op2,后输入的值除以op2,将结果压入栈底 */
       if (op2 != 0.0) /* 0 做分子无意义 */
        push(pop() / op2);
       else
        printf("error: zero divisor\n");
       break;
   case '\n':
       printf("\t%.8g\n", pop()); /*当按下 enter 键后 输出栈顶的值,即最终的计算结果*/
       break;
   default:
       printf("error: unknown command %s\n",s);
       break;
     } 
 
 }
 return 0;
}

#define MAXVAL 100  /* 栈VAL的最大深度 */

int sp = 0;     /* 下一个空闲栈的位置 */
double val[MAXVAL]; /* 值栈 */

/* push函数: 把f压入到值栈中 */
void push (double f)
{
 if (sp < MAXVAL)
  val [sp++] = f;
 else
  printf("error: stack full,can't push %g\n",f);

}

/* pop函数: 弹出并返回栈顶的值 */
double pop (void)
{
 if (sp > 0)
  return val [--sp];
 else
 {
  printf("error: stack empty\n");
  return 0.0;
 
 }

}

int getch(void);
void ungetch(int);
/* getop函数:获取下一个运算符或数值操作符 */
int getop (char s[])
{
 int i, c;
 while ((s[0] = c = getch()) ==  ' ' || c == '\t') /* 跳过空格与制表符 */
  ;
  s[1] = '\0';
 if (!isdigit(c) && c != '.') /*isdigit(c):测试字符是否为数字:是,返回非0,不是返回0*/
  return c;         /* 不是数 */
 
  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);  /* 把字符压回输入中 */
  return NUMBER;

#define BUFSIZE  100
char buf [BUFSIZE]; /* 用于ungetch函数的缓冲区*/
int bufp = 0 ;  /* buf中下一个空闲位置 */
int getch (void)   /*取一个字符(可能是压回的字符) */
{
 return (bufp > 0) ? buf [--bufp] : getchar();
 
}

void ungetch( int c )  /* 把字符压回到输入中 */
{
 if (bufp >= BUFSIZE )
  printf("ungetch: too many characters\n");
 else
  buf[bufp++] = c;

}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小白写逆波兰计算器 的相关文章

随机推荐

  • 计算机显卡和cpu的关系,cpu和显卡的关系

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 cpu和显卡的关系是都是计算机重要的硬件 CPU就是中央处理器 电脑中的所有命令几乎都要通过处理器来处理 可以将他简单理解为对数据初加工 而显卡主要是对图形进行处理 它能根
  • 机器学习---算法基础(八)SVM

    参考文献 机器学习数学 拉格朗日对偶问题 拉格朗日对偶问题 为什么支持向量机要用拉格朗日对偶算法来解最大化间隔问题 零基础学SVM Support Vector Machine 一 1 SVM概念 支持向量机 英语 support vect
  • SpringBoot实验合集(持续更新中...)

    实验一 使用Spring Boot构建应用程序 一 实验目的 1 掌握使用IntelliJ IDEA创建Spring Boot应用程序的方法 2 了解spring boot starter parent的配置内容 3 掌握如何利用Start
  • 如何用递归解决逆波兰表达式问题?

    描述 逆波兰表达式是一种把运算符前置的算术表达式 例如普通的表达式2 3的逆波兰表示法为 2 3 逆波兰表达式的优点是运算符之间不必有优先级关系 也不必用括号改变运算次序 例如 2 3 4的逆波兰表示法为 2 3 4 本题求解逆波兰表达式的
  • 蓝桥杯2023年真题 python B组

    第十四届蓝桥杯大赛软件赛省赛 Python 大学 B 组 Python 大学 B 组 试题 A 2023 本题总分 5 分 问题描述 请求出在 12345678 至 98765432 中 有多少个数中完全不包含 2023 完全不包含 202
  • 微服务搭建后端项目

    1 搭建分析 2 开始搭建父项目 父项目选SpringBoot项目 如果使用的idea社区版的话 那就创建maven项目导入如下依赖
  • 索引,元素下标,Java ListIterator 中的 nextIndex() 和 next();

    索引 元素下标 Java ListIterator 中的 nextIndex 和 next 问题 previousIndex 输出前一个元素的下标 索引 nextIndex 输出下一个元素的下标 索引 public static void
  • 使用css动画实现网易云音乐播放界面波浪动画效果

    通过实现CSS实现仿网易云音乐播放界面动画效果 最终的效果如下 界面布局 图片也是实现滚动效果的 使用四个div 来标识每一帧波动的效果 div class container wrap div class container div cl
  • 基于开路电压测量(OCV)的电量计获取锂离子(Li+)电池参数

    获取li 电池参数的步骤 确定满电量和空电量点 提取Li 电池参数的最佳方法是创建一个尽可能与实际应用接近的环境 其中包括保护电路 放电曲线 包括实际应用中有效电流和待机电流的典型值 以及充电曲线 因此需要模拟电池充电和放电过程 并监控和记
  • 地图切片的概念与原理

    为什么80 的码农都做不了架构师 gt gt gt 定义 地图切片 采用预生成的方法存放在服务器端 然后根据用户提交的不同请求 把相应的地图瓦片发送给客户端的过程 它是一种多分辨率层次模型 从瓦片金字塔底层到顶层 分辨率越来越低 但表示的地
  • Redis实现限流的三种方式

    一 固定窗口 所谓固定窗口限流即时间窗口的起始和结束时间是固定的 在固定时间段内允许要求的请求数量访问 超过则拒绝 当固定时间段结束后 再重新开始下一个时间段进行计数 我们可以根据当前的时间 以分钟为时间段 每分钟都生成一个key 用来in
  • Elasticlunr.js 支持其他语言 V0.9.5

    之前一直没有处理其他的语言的需求 所以没有测试elasticlunr js对于其他的语言的支持 多亏了Github的网友 帮忙发现了elasticlunr js对于其他语言支持的问题 昨天 elasticlunr js发布了V0 9 5版本
  • 苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax、iPhone 11、iPhone 12、屏幕适配

    iPhone设备 物理分辨率是硬件所支持的 逻辑分辨率是软件可以达到的 代数 设备 操作系统 逻辑分辨率 point 物理分辨率 pixel 屏幕尺寸 对角线长度 缩放因子 iPhone 第一代 iPhone 2G iOS 1 320 x
  • Centos7 安装Hadoop3 单机版本(伪分布式版本)

    环境版本 CentOS 7 JDK 8 Hadoop 3 CentOS 7 服务器设置 设置静态IP 查看IP配置在 etc sysconfig network scripts 目录下的ifcfg ens33文件中 root Hadoop3
  • requests设置代理ip------验证代理ip是否可用

    文章目录 1 代理ip设置 1 0 透明 普匿 高匿ip区别 1 1 代理设置格式 1 2 详细测试 1 3 报错407 2 验证ip是否可用demo 遇到不可用ip程序会停止 2 1 验证网站 2 2 代码及结果 2 2 1 http h
  • DataX读取Hive Orc格式表丢失数据处理记录

    文章目录 问题 问题概述 问题详细描述 原因 解决方法 修改源码 验证 问题 问题概述 DataX读取Hive Orc存储格式表数据丢失 问题详细描述 同步Hive表将数据发送到Kafka Hive表A数据总量如下 SQL select c
  • 【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(Python&Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python Matlab代码实现 1 概述 文献来源 瞬时能量的信号处理
  • 用两个栈模拟实现一个队列,其最大容量是多少?

    题目 如何用两个栈模拟实现一个队列 如果这两个堆栈的容量分别是m和n m gt n 你的方法能保证队列的最大容量是多少 这里讨论的是顺序栈 如果是链式栈的话完全没有必要考虑空间 分析 栈的特点是 后进先出 LIFO 而队列的特点是 先进先出
  • Day01人工智能学习---环境安装与配置

    从今天开始自学人工智能 并且每天记录学习过程与反思 希望能帮助遇到和我同样难题的学习者们 鄙人不才 我没遇到的情况也不太会处理 因为每个人电脑性能与使用情况不同 如果小伙伴你遇到其他的问题可以在CSDN是多搜索看看 最主要的是想督促自己每日
  • 小白写逆波兰计算器

    逆波兰计算器 淮南师范学院 电子工程学院 夏健钧 2017 3 24 逆波兰计数法 参考维基百科 include