简单计算器

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. hdu-1237简单计算器(栈的运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...

  2. HDU1237 简单计算器 栈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...

  3. HDU1237 简单的计算器 【堆】+【逆波兰式】

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

  4. hdu1237 简单计算器[STL 栈]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...

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

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

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

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

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

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

  8. python 逆波兰式

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

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

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

随机推荐

  1. LVS十种调度算法介绍

    1.轮叫调度(Round Robin)(简称rr) 轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod ...

  2. listview 控件

    private void Form1_Load(object sender, EventArgs e) { //设置该listview关联的imagelist listView1.LargeImage ...

  3. [Offer收割]编程练习赛42

    对局匹配 直接贪心 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #i ...

  4. 用LyX写中文幻灯片

    虽然在虚拟机装了texlive以备使用,但是在不动CTeX的情况下,是否能使用LyX写中文幻灯片呢.网上只是寥寥几篇大神们在Linux用LyX的博文. 最近把论文交完写幻灯片,于是也把这个想法尝试了一 ...

  5. css3实现3D切割轮播图案例

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. 关于VS 2013连接Microsoft Access 2013的相关问题

      ①   下载安装Microsoft Access Database Engine 2010 Redistributable(28MB),共有32bit(下载)和64bit(下载)两个版本,具体要安 ...

  7. 【转载】Java实现word转pdf

    最近遇到一个项目需要把word转成pdf,GOOGLE了一下网上的方案有很多,比如虚拟打印.给word装扩展插件等,这些方案都依赖于ms word程序,在java代码中也得使用诸如jacob或jcom ...

  8. (转) RabbitMQ学习之远程过程调用(RPC)(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887885 在一般使用RabbitMQ做RPC很容易.客户端发送一个请求消息然后服务器回复一个响 ...

  9. dw2018修改为中文

    dw2018 英文版修改为中文, 把zh_CN文件夹内的内容复制到en_US文件夹内并替换, 或者重命名zh_CN文件夹为en_US

  10. /usr/bin/ld: cannot find -lxxx 问题 解决方法总结

    最近在做毕设的收尾工作,很多程序都要部署到linux下来运行,遇到了挺多问题,昨天就集中性遇到了 在编译应用时,遇到了 /usr/bin/ld: cannot find -lxxx 这种情况是系统找不 ...