问题描述
给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中不应 包含任何括号。
示例 1:
输入:s = "(abcd)"
输出:"dcba"
示例 2:
输入:s = "(u(love)i)"
输出:"iloveu"
示例 3:
输入:s = "(ed(et(oc))el)"
输出:"leetcode"
示例 4:
输入:s = "a(bcdefghijkl(mno)p)q"
输出:"apmnolkjihgfedcbq"
说明:
0 <= s.length <= 2000
s 中只有小写英文字母和括号
我们确保所有括号都是成对出现的
输入说明
输入仅含有小写英文字母和括号的字符串
输出说明
输出一行,表示结果
输入范例
(u(love)i)
输出范例
iloveu
实现思路
用string接收输入的数据,依次遍历该字符串,若不是 ')' 则将字符入栈,否则出栈,一直出到字符为 '(' ,并在出栈的时候将字符存入vector定义的结构里,由于栈的特性是后进先出,所以在出栈进vector的时候就已经完成了反转,然后将反转后的数据再次压入原来的栈里。最后栈中的元素就是已经反转过的,但还是因为栈的先进后出的特性,此时需要再次反转才能输出最终结果。
实现代码
#include<iostream>
#include<stack>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
stack<char> s;
string str;
cin>>str;
for(int i = 0; i<str.size(); i++)
{
if(str[i]==')')
{
vector<char> s_rev;//用来反转
//进行反转: 由于栈的特性是先进后出,所以在出栈并进入s_rev的时候就已经完成了反转
while(s.top()!='(')
{
s_rev.push_back(s.top());
s.pop();
}
s.pop();//弹出 '('
//将反转后的元素重新进栈
for(int j = 0; j<s_rev.size(); j++)
{
s.push(s_rev[j]);
}
}
else
{
s.push(str[i]);
}
}
//最后栈中元素便是反转后的字符串,但要再反转一次得到最终结果
//因为比如原始字符串为(u(love)i),那么处理结束后栈中存储的结果为iloveu,但由于栈是先进后出,所以要再反转一次才能得到最终答案
vector<char> res;
while(!s.empty())
{
res.push_back(s.top());
cout<<s.top();
s.pop();
}
reverse(res.begin(),res.end());
for(int i = 0;i<res.size();i++){
cout << res[i];
}
cout<<endl;
return 0;
}