问题描述:

支线任务2-Basic Calculator-LMLPHP

题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格。

思路:

其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这个题还没有乘法除法运算,我就沿用了做算法作业题的思路来求解:

1.由原表达式求出后缀式

2.根据后缀式求值

当然,这个题由于没有乘除法,不需要考虑运算符的优先性而只需要考虑括号的分隔作用,相比于算法作业有很多地方可以简化:比如新的一个运算符号遇到栈顶符号时可以直接拿出栈顶符号,又比如在栈里在'('之上的至多只有一个符号。

具体解决方案:

1.利用一个char逐个读取string s里的字符,并作判断,若为空格不做操作;

2.利用一个字符栈进行后缀式求解,左扩号直接进栈;加减符号若遇栈顶同为加减号则退出栈顶符号加到后缀式,新符号进栈;右括号若遇栈顶为左括号则直接把左括号退出栈顶,否则退出运算符加入后缀式,再退出左括号;

3.数与数之间用'$'分隔开以便后缀式的计算,例:"$13$24";

4.用一个<int>栈计算后缀式的值,读取到表达式里面的数值则存入栈,遇到符号则对栈顶和栈顶下一位的数值进行相应的计算并把结果存在栈顶;

5.返回栈顶数值。

相应的代码:

 class Solution {
public:
int calculate(string s) {
stack<char> operation;
stack<int> numCan;
string newExp, temNumExp;
char temsave;
int temTop, temNum;
bool isNextNum = true;
istringstream iss;
for(int i = ;i < s.size();i++)//求得后缀式
{
temsave = s[i];
if(temsave != ' ')
{
if(temsave >= '' && temsave <= '')
{
if(isNextNum == true)
{
newExp += '$';//$分隔两个数
newExp += temsave;
isNextNum = false;
}
else
newExp += temsave;
}
else
{
isNextNum = true;
if(temsave == '+' || temsave == '-')
{
if(operation.empty() == true || operation.top() == '(')
operation.push(temsave);
else
{
newExp += operation.top();
operation.pop();
operation.push(temsave);
}
}
else if(temsave == '(')
operation.push(temsave);
else
{
if(operation.top() != '(')
{
newExp += operation.top();
operation.pop();
operation.pop();
}
else
operation.pop();
}
}
}
}
if(operation.empty() == false)
newExp += operation.top();
for(int i = ;i < newExp.size();i++)//计算后缀式
{
temsave = newExp[i];
if(temsave == '+' || temsave == '-')
{
temTop = numCan.top();
numCan.pop();
if(temsave == '+')
numCan.top() += temTop;
else
numCan.top() -= temTop;
}
else if(temsave == '$')
{
i++;
iss.clear();
while(newExp[i] != '+' && newExp[i] != '-' && newExp[i] != '$' && i < newExp.size())
{
temNumExp += newExp[i];
i++;
}
i--;
iss.str(temNumExp);
iss >> temNum;
numCan.push(temNum);
temNumExp = "";
}
}
return numCan.top();
}
};

运行结果:

支线任务2-Basic Calculator-LMLPHP

时间好长╮(╯▽╰)╭,然而没有时间改进了……

05-11 22:17