《C程序设计语言》练习题 5-10

编写程序 expr,计算从命令行输入的逆波兰表达式的值,其中每个运算符或操作数用一个单独的参数表示。例如,命令

expr 2 3 4 + *

计算表达式2x(3+4)的值

算法实现

getfloat.c:

// getfloat.c
#include<stdio.h>
#include<ctype.h>
int getfloat(char* str, double* store)
{
while (isspace(*str))
str++;
int ch, sign;
double power = 1.0;
ch = *str++;
sign = ch == '-' ? -1 : 1;
if (ch == '+' || ch == '-') {
ch == *str++;
}
for (*store == 0.0; isdigit(ch); ch = *str++) {
*store = *store*10.0 + ch - '0';
}
if (ch == '.') {
ch=*str++;
}
for (; isdigit(ch); ch = *str++) {
*store = *store*10.0 + ch - '0';
power *= 10.0;
}
if (ch == 0 || isspace(ch) || ch == EOF) {
//如果不能继续读取数字,那么跳出的原因必须是 ch==0 || isspace(ch) || ch==EOF
*store /= power;
*store *= sign;
return 1;
}
else {
return -1;
}
}

expr.c:

//expr.c
#include<stdio.h>
#include<ctype.h>
#define MAX_NUM 100
double stack[MAX_NUM];
extern int getfloat(char* str,double*);
int main(int argc, char* argv[])
{
if (argc < 2) {
printf("usage: expr num1 num2 operator ...\n");
return 1;
}
else {
int stackp = 0;
int ch = 0;
double num1, num2, ans;
while (--argc >= 1) {
ch = (*++argv)[0];
if (ch == '-'){
if (!isdigit(ch = (*argv)[1])) {
//是负号
if (stackp >= 2) {
num2 = stack[--stackp];
num1 = stack[--stackp];
stack[stackp++] = num1 - num2;
continue;
}
else {
printf("Error: at least two numbers are needed before operator '-'\n");
return -1;
}
}
}
if (isdigit(ch)) {
if (stackp < 0) {
printf("stack is underflowed!\n");
return -2;
}
else if (stackp >= MAX_NUM) {
printf("stack is overflowed!\n");
return -3;
}
else if (getfloat(*argv, &stack[stackp++]) == -1) {
printf("wrong argument to get number: %s\n", *argv);
return -4;
}
}
else if (ch == '+'||ch=='*'||ch=='/'||ch=='%') {
if (stackp >= 2) {
num2 = stack[--stackp];
num1 = stack[--stackp];
switch (ch) {
case '+':
ans = num1 + num2;
break;
case '*':
ans = num1*num2;
break;
case '/':
if (num2 == 0.0) {
printf("error zero divisor: %f / %f\n", num1, num2);
return -5;
}
ans = num1 / num2;
break;
case '%':
ans = (int)num1%(int)num2;
break;
}
stack[stackp++] = ans;
}
else {
printf("Error: at least two numbers are needed before operator '%c'\n",ch);
return -6;
}
}
else {
printf("wrong arguments for %c,usage: expr num1 num2 operator ...\n", ch);
return -7;
}
}
if (stackp == 1) {
printf("%.4f\n", stack[0]);
}
else {
printf("the format of input is wrong!\n");
}
}
return 0;
}

重温C语言(1)----计算算术表达式的值的更多相关文章

  1. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  2. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

  3. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  4. OpenJudge计算概论-简单算术表达式求值

    /*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...

  5. Dijkstra的双栈算术表达式求值算法

    这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...

  6. 算法手记(2)Dijkstra双栈算术表达式求值算法

    这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...

  7. 实现Linux下dc的功能,计算后缀表达式的值

    提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值 -将运算符写在两个操作数之后的表达式称为"后缀表达式",如上面的中缀表达式可转换为后缀表达式1 2 ...

  8. [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)

    Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...

  9. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

随机推荐

  1. Hadoop 3.1.2 下载安装和分布式搭建的准备

    官方有详细文档:https://hadoop.apache.org/docs/r3.1.2/hadoop-project-dist/hadoop-common/SingleCluster.html 我 ...

  2. python学习,day3:函数式编程,带参数

    # coding=utf-8 # Author: RyAn Bi def test(x,y,z): print(x) print(y) print(z) test(y=2,z =3,x=1) #形参与 ...

  3. Cisco ISR4400 Netflow 配置模板

    flow exporter NAME destination 145.0.1.200 transport udp 9991 export-protocol netflow-v5 flow monito ...

  4. Mac下使用Eclipse的Show in Terminal提示command not found: mvn

    在Mac下一般配置了Maven的环境变了一般都不会提示,但是如果使用zsh的扩展之后,系统默认的环境变量配置文件会发生变化,尤其使用Eclipse打开终端时,默认不会去读取用户目录下的~/.bashr ...

  5. Mac下常用快捷键(转)

    前提,先熟读键盘快捷键符号:http://www.cnblogs.com/EasonJim/p/6350075.html 基本操作: Command-Z 撤销 Command-X 剪切 Command ...

  6. 【HADR】How to reestablish HADR from scratch after a failure on Standby

    转载 http://www-01.ibm.com/support/docview.wss?uid=swg21514783 Cause  Have a HADR pair with Primary on ...

  7. spring boot快速入门 7: 使用aop处理请求

    样例:登陆拦截(aop简单样例) 第一步:在pom 文件中加入aop依赖 <!-- spring aop --> <dependency> <groupId>org ...

  8. Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发 ...

  9. C#中判断系统的架构(32位,还是64位)

    一种很简单的方法就是根据IntPtr类型的Size属性来判断, //IntPtr.Size在64位为8,在32位为4 public static Boolean Is64Bit() { ) retur ...

  10. Flex Graphics

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...