简单的计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 11955    Accepted Submission(s): 3896
Problem Description
读入一个仅仅包括 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 
Input
測试输入包括若干測试用例,每一个測试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中仅仅有0时输入结束,对应的结果不要输出。

 
Output
对每一个測试用例输出1行,即该表达式的值,精确到小数点后2位。
 
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
 
Sample Output
3.00
13.36

关键地方是在把中缀式转换成后缀式时要保持符号栈从顶開始严格递减。否则先出栈,再进栈。

#include <stdio.h>
#include <string.h>
char str[202], buf[202], sign[202]; //buf存储逆波兰式
double stack[202], a;
int len, n, id, id2, id3, id4; double perform(double x, double y, char ch){
if(ch == '*') return x * y;
if(ch == '/') return x / y;
if(ch == '+') return x + y;
return x - y;
} void check(char ch){
buf[id2++] = ' ';
if(ch == '*' || ch == '/'){
while(id3 && (sign[id3-1] == '*' || sign[id3-1] == '/'))
buf[id2++] = sign[--id3];
sign[id3++] = ch;
return;
}
while(id3) buf[id2++] = sign[--id3];
sign[id3++] = ch;
} int main(){
while(gets(str)){
len = strlen(str);
if(len == 1 && str[0] == '0') break;
id = id2 = id3 = id4 = 0;
for(int i = 0; i < len; ++i){
if(str[i] == ' ') continue;
if(str[i] >= '0' && str[i] <= '9'){
buf[id2++] = str[i];
}else check(str[i]);
}
while(id3) buf[id2++] = sign[--id3];
//for(int i = 0; i < id2; ++i) putchar(buf[i]);
for(int i = 0; i < id2; ++i){
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9'){
sscanf(buf + i, "%lf%n", &stack[id4++], &n);
i += n - 1;
}else stack[id4-2] = perform(stack[id4-2], stack[id4-1], buf[i]), --id4;
} printf("%.2lf\n", stack[0]);
}
return 0;
}

2014-11-3 21:55:30更新

#include <stdio.h>
#include <string.h> #define maxn 1000 char buf[maxn], out[maxn], stack[maxn];
int id, id1, ida;
double A[maxn]; int level(char ch) {
if(ch == '+' || ch == '-') return 1;
return 2;
} void check(char ch) {
while(id1 && level(stack[id1-1]) >= level(ch)) {
out[id++] = stack[--id1];
}
stack[id1++] = ch;
} double cal(double a, double b, char ch) {
if(ch == '-') return a - b;
if(ch == '+') return a + b;
if(ch == '*') return a * b;
return a / b;
} int main() {
int i, n;
bool sign;
double a;
while(gets(buf)) {
if(strlen(buf) == 1 && buf[0] == '0')
break;
id = id1 = 0; sign = 0;
for(i = 0; buf[i]; ++i) {
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9' || buf[i] == '.') {
if(sign) {
out[id++] = ' ';
sign = 0;
}
out[id++] = buf[i];
}
else sign = 1, check(buf[i]);
} while(id1) {
out[id++] = stack[--id1];
} for(i = ida = 0; i < id; ++i) {
if(out[i] == ' ') continue;
if(out[i] >= '0' && out[i] <= '9' || out[i] == '.') {
sscanf(out + i, "%lf%n", &a, &n);
A[ida++] = a; i += n - 1;
} else A[ida-2] = cal(A[ida-2], A[ida-1], out[i]), --ida;
} printf("%.2lf\n", A[0]);
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

HDU1237 简单的计算器 【堆】+【逆波兰式】的更多相关文章

  1. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. c# 逆波兰式实现计算器

    语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式  通常我们在写数学公式的时候  就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀 ...

  3. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  4. Haskell解决逆波兰式

    摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...

  5. [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)

    原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...

  6. python 逆波兰式

    逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部 class Stack(object): '''堆栈''' def __init__(self): se ...

  7. codechef Transform the Expression 转换成逆波兰式

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  8. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  9. Evaluate Reverse Polish Notation(逆波兰式)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

随机推荐

  1. php中如何开启GD库

    php中开启GD库 在浏览器输入启用wamp下的GD库(否则验证码可能不能用) D:\lamp\php\php.ini 文件

  2. 常用的JQuery数字类型验证正则表达式

    var regexEnum = {  intege:"^-?[1-9]//d*$",     //整数  intege1:"^[1-9]//d*$",     ...

  3. 15个最好的HTML5前端响应式框架(2014)

    文中的多个框架基于SASS创建,SCSS是一种比LESS更简洁的样式表编程语言,它能够编绎成CSS,可复用CSS代码,声明变量,甚至是函数,类Ruby/Python的语法.參见: LESS vs SA ...

  4. 【Cocos2d-X开发笔记】第一期 Cocos2d-X的环境搭建

          作者今天开始正式开始学习Cocos2d-X引擎进行游戏编程,预计两天会更新一期,最后实现ios游戏的appsore上线. (部分内容转载自:http://blog.csdn.net/yan ...

  5. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  6. Android开发技术周报

    Android开发技术周报 原文  http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...

  7. mongodb分页优化

    现在参与一个项目的开发,需要用java查询mongodb数据库,在这里分页用的skip sort 和limit结合,查询语句如下(已经在相关字段建立索引) DBCursor cursor = coll ...

  8. Androidclient和server端数据交互的第一种方法

    网上有非常多样例来演示Android客户端和server端数据怎样实现交互只是这些样例大多比較繁杂,对于刚開始学习的人来说这是不利的.如今介绍几种代码简单.逻辑清晰的交互样例,本篇博客介绍第一种: 一 ...

  9. 内存分析工具 MAT 的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  10. Linux下SVN账户密码保存设置

    Linux下用SVN进行更新等操作时,总是提示输入用户名和密码,很不方便.因此搜了下解决办法,总结如下: 打开SVN配置文件: vim /home/<user>/.subversion/c ...