C++xx题总结持续更新

*给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(含括号除外),计算其结果。
表达式仅包含非负整数,+, - ,
,/ 四种运算符和括号、空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " (3+2)2/2 "
输出: 5
示例 3:

/*
	给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(含括号除外),计算其结果。

	表达式仅包含非负整数,+, - ,*,/ 四种运算符和括号、空格  。 整数除法仅保留整数部分。

	示例 1:

	输入: "3+2*2"
	输出: 7
	示例 2:

	输入: " (3+2)*2/2 "
	输出: 5
	示例 3:

*/

#include 
#include 
#include 
#include
int calculate(std::string str)
{
	std::cout << "calculate:" << str.c_str() <<std::endl;
	std::stack<int> st;
	std::string temp = "";
	std::string str1 = "";
	int re = 0;
	bool bfindkuohao = false;
	int findkuohaoCnt = 0;
	char c='n';
	str += 'x';//加一个不是0-9的字符 为了能计算最后一个数
	for (auto ch: str)
	{
		if (ch == ' ')continue;
		else if (ch == '(') {
			str1 = "";
			bfindkuohao = true;
			findkuohaoCnt++;
		}
		else if (bfindkuohao) {
			if (ch == ')') {
				findkuohaoCnt--;
			}
			if (findkuohaoCnt != 0)
				str1 += ch;
			if (bfindkuohao && findkuohaoCnt == 0) {
				temp = std::to_string(calculate(str1));//括号递归计算
				bfindkuohao = false;
			}
		}
		else if (ch >= '0' && ch <= '9') temp += ch;//取出整数;
		else {
			//为空说明还没有数 填充
			if (st.empty()) {
				st.push(atoi(temp.c_str()));
			}
			else if (c != 'n') {
				//因为先乘除后加减,故 加减先保存,乘除直接算
				switch (c)
				{
				case '+':
					st.push(atoi(temp.c_str()));
					break;
				case '-':
					st.push(-atoi(temp.c_str()));
					break;
				case '*':
					re = st.top()*atoi(temp.c_str());
					st.pop();
					st.push(re);
					break;
				case '/':
					re = st.top()/atoi(temp.c_str());
					st.pop();
					st.push(re);
					break;
				default:
					break;
				}
			}
			c = ch;//记录符号
			temp = "";
		}
	}
	re = 0;
	while (!st.empty()) {
		re += st.top();
		st.pop();
	}
	return re;
}

int main()
{
	char str[1024];
	std::cin >> str;
	std::cout << calculate(str) << std::endl;
}

你可能感兴趣的:(c++,算法,开发语言)