cpp
#include <vector>
#include <string>
#include <stack>
#include <iostream>
using namespace std;
// s = "32@4$5@32"
int calculate(string s)
{
vector<string> cal;
for(int i =0;i<s.size();)
{
int start = i;
while(i<s.size()&&s[i] != '@' && s[i] != '$')
{
i++;
}
cal.push_back(s.substr(start, i - start));
if(i < s.size()&&(s[i] != '@' || s[i] != '$'))
{
cal.push_back(s.substr(i, 1));
i++;
}
}
vector<string> stackCal;
for(int i=0;i<cal.size();i++)
{
if(cal[i]!="@"&&cal[i]!="$")
{
stackCal.push_back(cal[i]);
}
else if(cal[i]=="@")
{
int a = stoi(stackCal.back());
int b = stoi(cal[++i]);
int c = a*b+b+3;
stackCal.back() = to_string(c);
}
else if(cal[i]=="$")
{
i++;
stackCal.push_back(cal[i]);
}
}
//双指针直接计算到最后
int ret = 0;
if(stackCal.size()==1)
{
return stoi(stackCal.back());
}
else
{
int a = stoi( stackCal[0]);
for(int i=1;i<stackCal.size();i++)
{
int b= stoi( stackCal[i]);
a= a*2+b*3;
}
return a;
}
}
int main() {
// Test cases
string test1 = "32@4$5@32"; // Expected: 855
string test2 = "1@2$3"; // Expected: 1@2=7, then 7$3 -> 7*2 + 3*3 = 23
string test3 = "10$20@30"; // Expected: 10$20=20, then 20@30=653 -> 653
string test4 = "5@6$7@8"; // Expected: 5@6=45, 45$7=7, 7@8=67 -> 45*2 + 7*3 + 67*3? (Need to clarify final step)
cout << "Test 1 (32@4$5@32): " << calculate(test1) << endl;
cout << "Test 2 (1@2$3): " << calculate(test2) << endl;
cout << "Test 3 (10$20@30): " << calculate(test3) << endl;
cout << "Test 4 (5@6$7@8): " << calculate(test4) << endl;
return 0;
}
这段代码的目标是解析一个包含特殊运算符 @
和 $
的字符串表达式,并按照给定的规则计算最终结果。以下是代码的主要逻辑:
1. 输入字符串示例
-
例如
"32@4$5@32"
,其中:-
@
是一个运算符,定义为a @ b = a * b + b + 3
。 -
$
是一个分隔符,表示直接拼接后续的数字,不进行运算。
-
2. 代码执行步骤
-
第一步:分词(Tokenization)
-
将字符串拆分为数字和运算符的组合。例如
"32@4$5@32"
会被拆分为:["32", "@", "4", "$", "5", "@", "32"]
-
-
第二步:处理
@
和$
运算符-
初始化一个栈
stackCal
来存储中间结果。 -
遍历分词后的列表:
-
如果是数字,直接压入栈。
-
如果是
@
:- 弹出栈顶数字
a
,取下一个数字b
,计算a @ b = a * b + b + 3
,并将结果压回栈。
- 弹出栈顶数字
-
如果是
$
:- 跳过
$
,直接将下一个数字压入栈。
- 跳过
-
-
对于
"32@4$5@32"
:-
压入
"32"
。 -
@
:计算32 @ 4 = 32*4 + 4 + 3 = 135
,栈变为["135"]
。 -
$
:跳过$
,压入"5"
,栈变为["135", "5"]
。 -
@
:计算5 @ 32 = 5*32 + 32 + 3 = 195
,栈变为["135", "195"]
。
-
-
-
第三步:最终计算
-
如果栈中只有一个数字,直接返回。
-
否则,按照
ret = ret * 2 + current_num * 3
的规则计算:-
初始
ret = 135
。 -
计算
135 * 2 + 195 * 3 = 270 + 585 = 855
。
-
-
最终结果为
855
。
-