非模板
思路
思路很简单,就是逐个字符读取
- 读取到
(
时,表明之后肯定有)
,同理)
时前面肯定有配对的(
,所以)
直接返回即可 - 如何实现运算符优先级
这里在更新的时候加上ah
,代表前一个运算数字
如果是低优先级,则直接运算即可
c res += ah;
高优先级,则表明先前的数ah
要和当前的数即时运算
res -= ah; ah *= getNum(); res += ah;
这里ah
全都用加法是因为在读取字符的时候,如果是减法,就会给ah = -1*getNum()
,来保证res
回退操作的一致性
Debug
- 第一次出错在没有考虑运算符优先级,直接加减乘除相同操作顺下来,导致错误
- 第二次在于设计问题,没有考虑到
Fun
中也可能读取到(
,而之前的写法(
只在getNum
中,因此在Fun
中多加了一个if
,解决。
代码
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
string s;
ll ans;
ll ind = 0;
ll Fun();
ll getNum();
ll getNum()
{
if (ind >= s.size())
{
return 0;
}
if (s[ind] == '(')
{
ind ++;
return Fun();
}
else
{
ll res = 0;
while (s[ind] >= '0' && s[ind] <= '9' && ind < s.size())
{
res *= 10;
res += s[ind] - '0';
ind ++;
}
return res;
}
}
ll Fun()
{
ll res = 0;
ll ah;
{
ah = getNum();
res = ah;
}
while (ind < s.size())
{
char t = s[ind++];
if (t == ')')
{
return res;
}
else if (t == '+')
{
ah = getNum();
res += ah;
}
else if (t == '-')
{
ah = -1*getNum();
res += ah;
}
else if (t == '*')
{
res -= ah;
ah *= getNum();
res += ah;
}
else if (t == '/')
{
res -= ah;
ah /= getNum();
res += ah;
}
else if (t == '(')
{
ah = getNum();
res += ah;
}
else {
printf ("Warning %lld %c \n", res, t);
return 0;
}
}
return res;
}
int main ()
{
cin >> s;
ans = Fun();
cout << ans;
}
/*
29
(3+5*4/2+2*(1+1)*(2+2))
*/
/*
275
(3/((1)*1)-3)+2*3-1-2-1-((1-3))*2-3+1-3-3-3*2-((2*2)+1*3)*3+2-2*3+3+1+2+(3+3)/3/2*3+2-(1*2/1)+2*3+2/2+3+(((2*2)))*2+2*2/2*2-(1/3)-1+3/2-1+((3*2)/3*2)+3*3*2*2+1-2+(1+1)*1+2*2+2*3-2+(((2*2)))-2*2+2-2-3-2-(3-2+2)/3*2/2/2/3-2+(1*1)*3*3*1+((2*(1-3)))*1*3/1+3*1*2-(((2+2))/3)*2*3*1+3/(3/3*1)*1*2*2*1-3*(1-2)*3/2/1+(3*((1)*2))*3/1-1*2*2/2+((3*(2)*3)*1)+1*2*1-2+(1*(1*3))/1+1/2/3-((1/3))/2*2+2/1+3/(2*2*3)*3/3*3+2-((1/(1+1)))/3-1/3*1+3-2-((2*2))+2-3+2/1+((1/1-1)+2)/3*3-1-2+1-(3*2)/3+3-3-(2+1)*2+2*2-1-(3-((1)*2)*1)-1/3-2+3-(1*(3)+3)*3+1*3*3*2+((3*1))*1/2-1-3+((1+3*2)+1)/1/1/1+3*2-1/(1/3-1+2)+1*2+2-2*3+2*3/((2-1))+3-1/1-2/2-(3-3+3)*2*3+2-((3/(3))*1)/3*1*1+(((2-3)*2))/3-2+3+1-(3*2/3)*3*1*1*3-(3/(2*3)/2)+3/3*3-2*2-2+((2*3-3))/3-3-1+2*1*1-(3*3)/1*(2-2)*3*2-1-3*3+(2*(3*3))+3/2+1*3-(((3*3))*3)*1/1+3-(3*(3*3)/3-1)*3+3-2-1+2+(((1*2))*1)+2*3*2+2*((1+1*3)*1)-3+2*3-1*2+(3*2-(2)*2)/2*3*1-3+1+2-((1*(3)*3+3))+3+1/1/2+2*1+1+1*((3+2))/3*2-2-1*1-(3/(3+3)*3)/2-3*3-1-2-1+(1/3)+2-3*1*1-(3/(3+3))*2-3*3-3-((3*1)/2)+3+3*1/3/3-(2-1-1)/2-1*1*2+(3+1)*1+2*2*3-1+((1-3)+1)-3*1/3+((1-3))+3-1/3*2+(1-(3*2)+1)*1/1*2/1+(((2*3)))/2*2*3*2-((3/2))-(1+2*1)+2+2/3-3*1-(3*(2/1+2))-3+1-3/3+1*2-(((1/1))*2)+3*1*2+(3/(2*(2))+3)*1*1*3-2*3+(2/(1-(1-3))*1)*1*3+2/2*1-(3-1*1+2)/1/1/2*1+((3-3-1)-2)+1-3*3/1-3/3*2*(3+3)-3*2*2+1+3-3*(1/2)*1*3/1+(2/3+(2)+1)-2+2+3/3-((1-2)+1)/2-1*3+1*((2*2-2)/1)+3*3*3*3*3-((3*(3))-3)+1*1*3*2+1+(3-2/1)*2*2+3*1+1+1*((1-2))-2/2-1+3+2+(3-(2+2))-2-2/2-2*3/1+2/(1*1/3+1)-3+2-2*3-2+((1+2)*3)/2-1-3-1*1-2+2*(((2/1)))/2-3*1-1*3+(1/3-(1*3))*2*3/2*3/2-((1*3))/2-2*1/2+2/2*(3-3)+1-3*1+2+(1+(1-3))-1+2-2+1-(2-1)+1/2-2*2+2-((1-3*2)+2)/3*1*3-3-1-((3-(2*3)))*3-1*3*1*1-1+((3*(1))*3)+3*1-2+((3*2))+3+1*3*3+3+(3*1)*1*(3/1)*2*1-2*1/2+(3-(2)*3)+2-3-3-2+2-((1/1))*2*1/1*2/3+(2*3)-2+3/3+1*1-((1+(3))*2)*2+1+2*3+(3-(1+2))-2-3*2*2*2-3+(3+(1)/3)/2*3+3*3-3-(((2*2))*1)*2/1/1*1*1*1-(3/1)*1/2/1-3/3+1-1+(2-(3-1))*2+2*2*2*1-3+((3+(1))*2)*2+1-2/3*1+(2+(1)*1-3)/2*1/1+3+(2-1*3)/2+3*3+2*2+(3*2*1-3)+2+3*2-1-1*(3*2)*2-2/1-2-3*1
*/