作者: Turbo时间限制: 1S章节: DS:栈
问题描述 :
给出一个字符串 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
解题思路:对输入的字符串进行处理,当遇到非“)”符号时,入栈stac,否则,将此时括号封装的内容进行一次翻转,这里的翻转操作就是讲括号封装的内容一个一个出栈,同时入队,处理之后,将temp队列中的元素出队,然后存入stac栈中,此时再对stac进行一次翻转,就是出栈,入队,然后按队列输出。
#include
#include
#include
#include
using namespace std;
int main()
{
stack<char> stac,res;//两个栈,一个用于过程处理,一个用于存结果
queue<char> temp;
char s[2000];
scanf("%s",&s);
for(int i=0;s[i]!='\0';i++)
{
if(s[i]==')')
{
while(stac.top()!='(')
{
temp.push(stac.top());
stac.pop();
}
stac.pop();
while(!temp.empty())
{
stac.push(temp.front());
temp.pop();
}
}
else{
stac.push(s[i]);
}
}
while(!stac.empty())
{
res.push(stac.top());
stac.pop();
}
while(!res.empty())
{
cout<<res.top();
res.pop();
}
cout<<endl;
return 0;
}