题意:输入一个算术表达式,求值(数字为整数,但结果不一定是整数,不存在不合法的输入)。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237

——>>这是中缀表达式的运算。开两个栈,一个用来存操作数,一个用来存运算符。定义3个级别,# 的级别最低,+ 和 - 的级别相同且高于 #,* 和 / 的级别相同且高于 + 和 - ,先往运算符栈放入一个 # ,表达式最后也加一个 #,读表达式,若读到数字,则以数字类型输入,直接放入操作数栈,若读到的是运算符,则比较读到的运算符与运算符栈顶符号的级别,若比栈顶的高,则入栈,否则,从数栈取两个操作数进行运算符栈顶元素的运算,再把结果压入数栈,刚刚读到的运算符再与现在运算符栈顶元素的级别进行比较……最后数剩下的一个元素,就是结果。

代码如下:

/*
 * 1237_5.cpp
 *
 *  Created on: 2013年8月7日
 *      Author: Administrator
 *      就算成为不了章泽天的男朋友,也要成为她的校友。。。。
 *      fighting!!!!!
 */

#include <iostream>
#include <stack>
#include <cstdio>

using namespace std;

int priority(char c) {
	if (c == '#') {
		return 1;
	} else if (c == '+' || c == '-') {
		return 2;
	} else if (c == '*' || c == '/') {
		return 3;
	}

	return -1;
}

double cal(double a, double b, char c) {
	if (c == '+') {
		return a + b;
	} else if (c == '-') {
		return a - b;
	} else if (c == '*') {
		return a * b;
	} else if (c == '/') {
		return a / b;
	}

	return -1;
}

int main() {
	char s[210];

	while (cin.getline(s, sizeof(s))) {
		if (strcmp(s, "0") == 0) {
			break;
		}

		int len = strlen(s);
		s[len++] = ' ';
		s[len++] = '#';
		s[len] = 0;

		stack<double> digit;
		stack<char> f;
		f.push('#');

		for (int i = 0; i < len; ++i) {
			if (s[i] == ' ') {
				continue;
			}

			if (isdigit(s[i])) {
				double temp;
				sscanf(s + i, "%lf", &temp);
				digit.push(temp);

				while (isdigit(s[i + 1])) {
					i++;
				}
			} else {
				bool ok = 1;

				while (ok) {

					if (priority(s[i]) > priority(f.top())) {
						f.push(s[i]);
						ok = 0;
					} else {

						if (s[i] == '#' && f.top() == '#') {
							break;
						}
						double b = digit.top();
						digit.pop();
						double a = digit.top();
						digit.pop();
						char c = f.top();
						f.pop();

						double ret = cal(a, b, c);
						digit.push(ret);

					}
				}
			}
		}

		double result = digit.top();
		printf("%.2lf\n", result);

		while (!f.empty()) {
			f.pop();
		}
		while (!digit.empty()) {
			digit.pop();
		}
	}

}