开个贴记录一下自己写过的代码,苦逼大三csp想考300
题目
一、思路
1.切割“=”左右,用String字符串来保存等式左右;
2.同样步骤对“+”切割,计算每个元素的出现次数;
切割示例代码
vector<string> split(string s){
vector<string> data;
int num=0,count=0;
for(int i=0;i<s.size();i++){
if(s[i]=='+'){
//此处是对'+'切割,若要对'='切割,只需替换
data.push_back(s.substr(num,count));
num=i+1;
count=0;
}else{
count++;
}
}
data.push_back(s.substr(num,count));
return data;
}
3.对各个元素进行元素统计,先取出系数值,保存为beishu,之后每个元素个数都乘上倍数;
4.从后往前遍历,记录元素个数,碰到括号就将倍数入栈或出栈;
5.将所有元素分别保存在两个map中,最后对比map的值,输出Y or N;
元素统计代码
void my_count1(string s){
int beishu,beishu2=1;
string s1="";
int num=0;
stack<int> bei; //碰到括号才用的栈,记录了倍数
while(s[num]-'0'>=0&&s[num]-'0'<=9){
num++;
} //寻找系数
if(num!=0){
s1=s.substr(0,num);
beishu=to_int(s1);
}else beishu=1;
s1="";
int x=1;
int flag=0;
int length=s.size();
for(int i=length-1;i>=num;i--){
//倒序匹配
if(flag==1){
flag=0; //用来跳过特殊情况
continue;
}
if(s[i]==')'){
bei.push(x);
beishu2=x*beishu2;
x=1;
}else if(s[i]=='('){
beishu2=beishu2/bei.top(); //碰见正括号需要将beishu还原到之前的状态
bei.pop();
}
if(s[i]-'0'>=0&&s[i]-'0'<=9){
s1=s.substr(i,1)+s1;
if(s[i-1]-'0'<0&&s[i-1]>9){
x=to_int(s1);
s1="";
}else{
x=to_int(s1);
}
}
if(s[i]-'a'>=0&&s[i]-'a'<=26