四则运算

/*
功能:四则运算
输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"
返回:算术表达式的计算结果
约束:
pucExpression字符串中的有效字符包括[‘0’ - ‘9’], ‘ + ’, ‘ - ’, ‘*’, ‘ / ’, ‘(’, ‘)’, ‘[’, ‘]’, ‘{ ’, ‘ }’
pucExpression算术表达式的有效性由调用者保证;
*/
#include <iostream>
#include <string>
#include <cctype>
#include <map>
#include <stack>

using namespace std;

int StrToNum(string number)
{
	int result = 0;
	int n = number.length();
	for (int i = 0; i < n; ++i) result = result * 10 + number[i] - '0';
	return result;
}

int calculate(string &Expression)
{
	int n = Expression.length();
	for (int i = 0; i < n; ++i)
	{
		if (Expression[i] == '-' && (i == 0 || Expression[i - 1] == '(' || Expression[i - 1] == '[' || Expression[i - 1] == '{'))
		{
			Expression.insert(i, 1, '0');
			++n;
		}
	}
	map<char, int> symbol;
	symbol['+'] = 1;
	symbol['-'] = 1;
	symbol['*'] = 2;
	symbol['/'] = 2;
	symbol['('] = 0;
	symbol['['] = 0;
	symbol['{'] = 0;
	symbol[')'] = -1;
	symbol[']'] = -1;
	symbol['}'] = -1;
	stack<char> SymStack;
	string inExpression;
	for (int i = 0; i < n; ++i)
	{
		if (isdigit(Expression[i]))
		{			
			while (isdigit(Expression[i]))
			{
				inExpression.push_back(Expression[i]);
				++i;
			}
			inExpression.push_back(' ');
			--i;
		}
		else
		{
			if (symbol[Expression[i]] > 0)
			{
				if (SymStack.empty() || symbol[Expression[i]] > symbol[SymStack.top()])
					SymStack.push(Expression[i]);
				else
				{
					while (!SymStack.empty() && symbol[SymStack.top()] >= symbol[Expression[i]])
					{
						inExpression.push_back(SymStack.top());
						SymStack.pop();
					}
					SymStack.push(Expression[i]);
				}
			}
			else if (symbol[Expression[i]] == 0)
			{
				SymStack.push(Expression[i]);
			}
			else
			{
				while (symbol[SymStack.top()])
				{
					inExpression.push_back(SymStack.top());
					SymStack.pop();
				}
				SymStack.pop();
			}
		}
	}
	while (!SymStack.empty())
	{
		inExpression.push_back(SymStack.top());
		SymStack.pop();
	}
//	cout << "inExpression: " << inExpression << endl;
	stack<int> result;
	n = inExpression.length();
	for (int i = 0; i < n; ++i)
	{
		if (isdigit(inExpression[i]))
		{
			string num;
			while (inExpression[i] != ' ')
			{
				num.push_back(inExpression[i]);
				++i;
			}
			result.push(StrToNum(num));
		}
		else
		{
			int num2 = result.top();
			result.pop();
			int num1 = result.top();
			result.pop();
			if (inExpression[i] == '+')	result.push(num1 + num2);
			else if (inExpression[i] == '-') result.push(num1 - num2);
			else if (inExpression[i] == '*') result.push(num1 * num2);
			else
			{
				if (num2 == 0) return 0;
				result.push(num1 / num2);
			}
		}
	}
	return result.top();
}

int main()
{
	string Expression;
	while (cin >> Expression) cout << calculate(Expression) << endl;
	return 0;
}


/*
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。
功能: 对输入的字符串表达式进行求值计算,并输出结果。
输入:String inputString:表达式字符串
返回: int :正常返回true,失败返回false
*/
#include <iostream>
#include <string>
#include <cctype>
#include <map>
#include <stack>
#include <algorithm>

using namespace std;

int StrToNum(string number)
{
	int result = 0;
	int n = number.length();
	for (int i = 0; i < n; ++i) result = result * 10 + number[i] - '0';
	return result;
}

int calculate(string &Expression, stack<int> &result)
{
	if (count(Expression.begin(), Expression.end(), '(') != count(Expression.begin(), Expression.end(), ')')) return -1;
	int n = Expression.length();
	for (int i = 0; i < n; ++i)
	{
		if (Expression[i] == '-' && (i == 0 || Expression[i - 1] == '(' || Expression[i - 1] == '[' || Expression[i - 1] == '{'))
		{
			Expression.insert(i, 1, '0');
			++n;
		}
	}
	map<char, int> symbol;
	symbol['+'] = 1;
	symbol['-'] = 1;
	symbol['*'] = 2;
	symbol['/'] = 2;
	symbol['('] = 0;	
	symbol[')'] = -1;	
	stack<char> SymStack;
	string inExpression;
	for (int i = 0; i < n; ++i)
	{
		if (isdigit(Expression[i]))
		{
			while (isdigit(Expression[i]))
			{
				inExpression.push_back(Expression[i]);
				++i;
			}
			inExpression.push_back(' ');
			--i;
		}
		else
		{
			if (symbol[Expression[i]] > 0)
			{
				if (SymStack.empty() || symbol[Expression[i]] > symbol[SymStack.top()])
					SymStack.push(Expression[i]);
				else
				{
					while (!SymStack.empty() && symbol[SymStack.top()] >= symbol[Expression[i]])
					{
						inExpression.push_back(SymStack.top());
						SymStack.pop();
					}
					SymStack.push(Expression[i]);
				}
			}
			else if (symbol[Expression[i]] == 0)
			{
				SymStack.push(Expression[i]);
			}
			else
			{
				while (!SymStack.empty() && symbol[SymStack.top()])
				{
					inExpression.push_back(SymStack.top());
					SymStack.pop();
				}
				if (SymStack.empty()) return -1;
				SymStack.pop();
			}
		}
	}
	while (!SymStack.empty())
	{
		inExpression.push_back(SymStack.top());
		SymStack.pop();
	}
	//	cout << "inExpression: " << inExpression << endl;
	
	n = inExpression.length();
	for (int i = 0; i < n; ++i)
	{
		if (isdigit(inExpression[i]))
		{
			string num;
			while (inExpression[i] != ' ')
			{
				num.push_back(inExpression[i]);
				++i;
			}
			result.push(StrToNum(num));
		}
		else
		{
			if (result.empty()) return -1;
			int num2 = result.top();
			result.pop();
			if (result.empty()) return -1;
			int num1 = result.top();
			result.pop();
			if (inExpression[i] == '+')	result.push(num1 + num2);
			else if (inExpression[i] == '-') result.push(num1 - num2);
			else if (inExpression[i] == '*') result.push(num1 * num2);
			else
			{
				if (num2 == 0) return -1;
				result.push(num1 / num2);
			}
		}
	}
	if (result.size() == 1)	return 0;
	else return -1;
}

int main()
{
	string Expression;
	while (cin >> Expression)
	{
		stack<int> result;
		int r = calculate(Expression, result);
		if (r == -1) cout << "false" << endl;
		else cout << result.top() << endl << "true" << endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值