题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=1237

简单计算器

Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

表达式计算,把前缀表达式变成后缀表达式再计算。。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<stack>
#include<set>
using std::cin;
using std::sort;
using std::pair;
using std::stack;
using std::string;
using std::getline;
#define pb(e) push_back(e)
#define sz(c) (int)(c).size()
#define mp(a, b) make_pair(a, b)
#define all(c) (c).begin(), (c).end()
#define iter(c) decltype((c).begin())
#define cls(arr, val) memset(arr, val, sizeof(arr))
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for(int i = 0; i < (int)n; i++)
#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
const int N = 5010;
const int INF = 0x3f3f3f3f;
typedef unsigned long long ull;
class ExpCalc {
private:
string ret;
stack<char> op;
stack<double> num;
inline void erase() {
ret = "";
while (!op.empty()) op.pop();
while (!num.empty()) num.pop();
}
inline bool is_digit(char ch) {
return ch >= '0' && ch <= '9';
}
inline bool get_op(char ch) {
char buf[10] = "+-*/";
for (int i = 0; i < 4; i++) {
if (buf[i] == ch) return true;
}
return false;
}
inline int cmp(char ch) {
switch (ch) {
case '+':
case '-': return 1;
case '*':
case '/': return 2;
}
return 0;
}
inline double calc(double d1, double d2, char ch) {
double val = 0.0;
switch (ch) {
case '+': val = d1 + d2;
break;
case '-': val = d2 - d1;
break;
case '*': val = d1 * d2;
break;
case '/': val = d2 / d1;
break;
}
return val;
}
public:
ExpCalc() { erase(); }
~ExpCalc() { erase(); }
inline void InfixToPostfix(const string src) {
int n = src.length();
for (int i = 0; i < n;) {
if (' ' == src[i] || '=' == src[i]) { i++; continue; }
if ('(' == src[i]) op.push(src[i++]);
if (')' == src[i]) {
while (op.top() != '(') {
ret += op.top(); ret += ' ';
op.pop();
}
op.pop(); i++;
} else if (get_op(src[i])) {
while (!op.empty() && cmp(op.top()) >= cmp(src[i])) {
ret += op.top(); ret += ' ';
op.pop();
}
op.push(src[i++]);
} else {
while (is_digit(src[i]) || '.' == src[i]) {
ret += src[i++];
}
ret += ' ';
}
}
while (!op.empty()) {
ret += op.top(); ret += ' ';
op.pop();
}
ret += '=';
}
inline double PostfixCalc() {
int n = ret.length();
for (int i = 0; i < n;) {
if (' ' == ret[i] || '=' == ret[i]) { i++; continue; }
if (get_op(ret[i])) {
double d1 = num.top(); num.pop();
double d2 = num.top(); num.pop();
num.push(calc(d1, d2, ret[i++]));
} else if (is_digit(ret[i]) || '.' == ret[i]) {
double x = 0.0;
while (is_digit(ret[i])) {
x = x * 10 + ret[i++] - '0';
}
if ('.' == ret[i]) {
i++;
double y = 0.0, k = 10.0;
while (is_digit(ret[i])) {
y += (ret[i++] - '0') / k;
k *= 10;
}
x += y;
}
num.push(x);
}
}
return num.top();
}
};
int main() {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
string src;
while (getline(cin, src) && src != "0") {
ExpCalc work;
work.InfixToPostfix(src);
printf("%.2lf\n", work.PostfixCalc());
}
return 0;
}

hdu 1237 简单计算器的更多相关文章

  1. hdu 1237 简单计算器(栈处理)

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

  2. hdu 1237 简单计算器 (表达式求值)【stack】

    <题目链接> 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值.  Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, ...

  3. HDU 1237 简单计算器(栈+stringstream)

    提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...

  4. HDU 1237 简单计算器 栈

    额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...

  5. hdoj 1237 简单计算器

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

  6. HDOJ 1237题 简单计算器

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

  7. hdu-1237简单计算器(栈的运用)

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

  8. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  9. *HDU 1237 栈

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

随机推荐

  1. 移动端拖拽(模块化开发,触摸事件,webpack)

    通过jquery可以很容易实现CP端的拖拽.但是在移动端却不好用了.于是我自己写了一个在移动端的拖拽demo,主要用到的事件是触摸事件(touchstart,touchmove和touchend). ...

  2. int型的数到底最大值是多少?

    本文摘自:http://blog.csdn.net/friendbaby/article/details/6822690 刚才在百度知道上看见一个网友问int型的数最大能存多少.这个问题其实计算机系统 ...

  3. c# 读取XML数据

    1.首先调用接口,要有一个post数据到指定url并返回数据的函数: protected string PostXmlToUrl(string url, string postData) { stri ...

  4. iOS调试 LLDB

      LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件.   常用调试命令:   1.print命 ...

  5. C# 正则表达式及常用正则表达式

    元字符 描述 .点 匹配任何单个字符.例如正则表达式r.t匹配这些字符串:rat.rut.r t,但是不匹配root. $ 匹配行结束符.例如正则表达式weasel$ 能够匹配字符串"He' ...

  6. hbase 各个概念,region,storefile

    HBase中有两张特殊的Table,-ROOT-和.META. .META.:记录了用户表的Region信息,它可以有多高region(这的意思是说.META.表可以分 裂成多个region,和用户表 ...

  7. ASP.NET(C#)--Repeater中生成“序号”列

    需求介绍:在Repeater(Table)中加入“序号”列,从1开始自增,步长为1. 思路:因为“序号”跟Repeater的行号有关,所以要在Repeater的ItemDataBound事件中输出“序 ...

  8. url中文参数解决方案

    首先,弄清楚为什么url传递中文会转码或者乱码,以及http头 contentType="text/html; charset=GBK" 的作用. html代码会经过web服务器, ...

  9. slf4j+log4j配置

    下载三个包: 三个包分别是:log4j的API包,slf4j的API包,slf4j对log4j的适配包. 选择使用slf4j一个重要的原因是支持占位符{},不用频繁操作字符串对象. 实现代码如下: i ...

  10. js 实现获取对象所有键名(key)的方法

    1.for in 循环 并且使用hasOwnProperty 方法 var jsonObject1 = { "name": "xiaoming", " ...