简单的计算器

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. 让自己的软件实现拖拽打开文件(使用WM_DROPFILES消息和DragQueryFile函数)

    //声明 protected procedure WMDROPFILES(var Msg : TMessage); message WM_DROPFILES; //实现 procedure TForm ...

  2. ruby on rails创建的页面訪问很慢

    ruby on rails创建的页面訪问很慢 用rvm安装的ruby1.9.3 解决:cd ~/.rvm/rubies/ruby-1.9.3-p547/lib/ruby/1.9.1/webrick v ...

  3. 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

    尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...

  4. 利用Node.js实现模拟Session验证的登陆

    1.身份验证和用户登陆 在一般的Web应用上,假设要实现用户登陆,最经常使用,也是最简单的方法就是使用Session,主要的思路是在Session中保留一些用户身份信息,然后每次在Session中取, ...

  5. Visual Assist X 10.8.2052的Crack破解补丁. 2014.11.05 (General release.)

    VA小组立即更新频率似有些放缓几乎,版本号都是2个月才更新一次,而这次的更新幅度也还是比較大的,新增了6个特性,而且修正和20余处大大小小的问题,而且也是正式发行版,推荐更新. 对于破解补丁还是老规矩 ...

  6. linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)

    #!/bin/sh while true do ps | grep "main_3g" | grep -v "grep" > /dev/null if [ ...

  7. cocos2D(三)---- 第一cocos2d的程序代码分析

    在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示 ...

  8. 正则匹配去掉字符串中的html标签

    1.得到超链接中的链接地址: string matchString = @"<a[^>]+href=\s*(?:'(?<href>[^']+)'|"&quo ...

  9. COST CUTTING THE ALAN GREENBERG WAY

    AnatBird.com COST CUTTING THE ALAN GREENBERG WAY

  10. inkscape - 百度百科

    http://wapbaike.baidu.com/view/1267893.htm?ssid=0&from=844b&uid=3151E6C0905477A13653132D762B ...