有符号一位数中缀式的计算。HOJ2189 Single Digit Adder。

用stl stack实现中缀转后缀及后缀运算。

转换之前将缺少的操作数补0。

Single Digit Adder


Time limit: 1sec. Submitted: 197
Memory limit: 32M Accepted: 45
Source: The 2005 ACM Pacific Northwest Programming Contest

Write a program that can evaluate expressions from the following roughly BNF (Backus Naur Form) grammar:

expr ::= term | expr ‘+’ term | expr ‘-’ term
unary_op ::= ‘+’ term | ‘-’ term
term ::= ‘(’ expr ‘)’ | ‘(’ unary_op ‘)’ | literal
literal ::= [0-9]

There will be no whitespace within an expression. All expressions will consist solely of the characters (, ), +, -, and the digits 0 through 9. You may assume that all input is well-formed.

Input

The input will consist of one expression per line followed by a newline. There will be no blank lines in the file.

Output

For each expression, output its integer value, followed by a single newline.

Sample Input

1
(-2)+3
(1-(2+3))
(1-2+3)
(1-(+(2-3)))

Sample Output

1
1
-4
2
2

说明:
给出表达式。 由有符号一位数和运算符 + - 及 括号 组成。
计算结果。
为了将中缀表达为后缀。 将单操作数运算符前补零。
如 (-2)+3 先转换为 (0-2)+3。
然后中缀转后缀。 后缀运算。
stl stack 实现。
代码如下:
#include<iostream>
#include
<stack>
using namespace std;

bool isd(char a) {
if (a >= '0' && a <= '9')return true;
return false;
}

int main() {
string ex;
while (cin >> ex) {
stack
<char> a;
string tmp = "";
for (int i = 0; i < ex.length(); i++) {
if ((ex[i] == '+' || ex[i] == '-') && (i - 1 < 0 || (!isd(ex[i - 1]) && ex[i - 1] != ')'))) {
ex.insert(i,
"0");
i
--;
}
else if (isd(ex[i]))tmp += ex[i];
else if (ex[i] == '(') a.push(ex[i]);
else if (ex[i] == ')') {
while (a.top() != '(') {
tmp
+= a.top();
a.pop();
}
a.pop();
}
else {
if (a.empty() || a.top() == '(')a.push(ex[i]);
else {
tmp
+= a.top();
a.pop();
a.push(ex[i]);
}
}
}
while (!a.empty()) {
tmp
+= a.top();
a.pop();
}
stack
<int> b;
for (int i = 0; i < tmp.length(); i++) {
if (isd(tmp[i]))b.push(tmp[i] - '0');
else {
int tmp1, tmp2;
tmp2
= b.top();
b.pop();
tmp1
= b.top();
b.pop();
if (tmp[i] == '+')b.push(tmp1 + tmp2);
else b.push(tmp1 - tmp2);
}
}
cout
<< b.top() << endl;
}
return 0;
}
 
posted @ 2011-06-15 00:41  归雾  阅读(254)  评论(0编辑  收藏  举报