12 反转每对括号间的子串

12 反转每对括号间的子串

作者: 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;
}

你可能感兴趣的:(DHUOJ+LeetCode)