天梯——算式拆分
这道题提供两种解法,一种是字符串,一种是利用栈
字符串
#include<bits/stdc++.h>
using namespace std;
int main(){string s;cin>>s;while(s.size()){int a=s.find(')');//查找第一次出现)的位置int b=s.rfind('(',a);//从a开始,向前查找第一次出现的(;cout<<s.substr(b+1,a-b-1)<<endl;//提取(不带括号)s.erase(b,a-b+1);//删除(带括号)}return 0;
}
find和rfind是解题关键,下面这篇博客介绍的很详细
c++ string中rfind()与find()的简单学习使用_string rfind-CSDN博客
栈
#include<bits/stdc++.h>
using namespace std;
int main(){string s;cin>>s;stack<char>h;//建栈for(int i=0;i<s.length();i++){if(s[i]==')'){int j=i-1;while(s[j]!='('){//向左遍历,让括号里面的字符进栈h.push(s[j]);j--;}s.erase(j,i-j+1);//连同括号一起删除while(!h.empty()){ //利用栈的特性(后进先出),逆序输出括号里的内容。cout<<h.top();//输出栈顶元素h.pop(); //弹出栈顶元素}i=j-1;//将i更新为左括号前面的位置,继续下一层循环cout<<endl;}}return 0;
}
注意
不一定非要用栈,栈在这里的作用是逆序(先进后出)存储括号内的内容,以便在输出时能够按照正确的顺序(括号内的顺序)输出。如果使用其他数据结构,只要能够实现逆序存储或输出,也可以达到相同的效果。
例如使用 vector 的替代方法: 可以使用 vector 来存储括号内的内容,然后在输出时逆序遍历 vector 。以下是修改后的代码示例:
#include<bits/stdc++.h>
using namespace std;int main()
{string s;cin >> s;vector<char> temp; // 使用 vector 替代栈for (int i = 0; i < s.size(); i++){if (s[i] == ')'){int j = i - 1;while (s[j] != '('){temp.push_back(s[j]); // 将字符存储到 vector 中j--;}s.erase(j, i - j + 1); // 删除括号对// 逆序输出 vector 中的内容for (int k = temp.size() - 1; k >= 0; k--){cout << temp[k];}temp.clear(); // 清空 vectori = j - 1; // 调整循环变量cout << endl;}}return 0;
}