重温C语言(1)----计算算术表达式的值
《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)----计算算术表达式的值的更多相关文章
- 【算法】E.W.Dijkstra算术表达式求值
算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- OpenJudge计算概论-简单算术表达式求值
/*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...
- Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...
- 算法手记(2)Dijkstra双栈算术表达式求值算法
这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...
- 实现Linux下dc的功能,计算后缀表达式的值
提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值 -将运算符写在两个操作数之后的表达式称为"后缀表达式",如上面的中缀表达式可转换为后缀表达式1 2 ...
- [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)
Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
随机推荐
- mysql工具——mysqlcheck(MYISAM)
基本介绍 演示: 使用optimize的时候,可能会出现 Table does not support optimize, doing recreate + analyze instead 这时候参考 ...
- service iptables xxx无效命令的情况下,如何启动/重启iptables
最近在CentOS 7.6下使用service iptables xxx相关命令,提示如下错误:The service command supports only basic LSB actions ...
- Mac 10.12安装粘贴板增加工具ClipMenu
说明:这个工具可以保留复制过的记录,并且可以快速调出之前复制过的内容,最开发时比较常用,支持图片等. 下载: (链接: https://pan.baidu.com/s/1qXJbM2o 密码: wef ...
- 【转发】Webdriver使用自定义Firefox Profile运行测试
点击进入转发地址: 一般我们使用如下代码启动Firefox: 这样Selenium Server启动的Firefox将是一个全新的,不安装任何Add-On的Firefox. 如果有需要,我们可以使用我 ...
- CSS动态控制DIV居中
1.所谓的动态:就是即使手动去拖拉浏览器,DIV还是会自动居中 2.之前一直以为这个事情是JavaScript做的, 步骤:通过先获取页面的Height和Width, 然后定义DIV的Height和W ...
- linux下统计文本行数的各种方法(一)
文件test1.txt有17行 方法一: awk '{print NR}' test1.txt | tail -n1
- Upgrading WebLogic Application Environments --官方文档
http://docs.oracle.com/cd/E13179_01/common/docs92/upgrade/dirstruct.html WebLogic Domain Directory S ...
- Visual Studio 2017 远程调试(Remote Debugger)应用
I.远程调试情景 项目部署在远程服务器或非本地环境中,需要 处理应用中遇到的一些错误时 (不能直接附加进程或F5调试应用). II. 远程调试准备 1.远程服务器--操作系统和硬件要求 MSDN 操作 ...
- android studio的jni和so
1. android studio自己添加代码生成so 代码地址:https://github.com/maogefff/Android-Test-Sample/tree/master/MyJni 参 ...
- 玩转树莓派《二》——用python实现动画与多媒体
环境:树莓派,系统raspbian,系统自带两个版本的python以及pygame. 1.画板 程序如下: !/home/pi/game_1.py import pygame width = 640 ...