查找给定字符串中括号对的顺序号

时间:2019-05-18 12:40:07

标签: c++

以字符串形式打印开括号和闭括号的订单号 例如 ”((())(()))” 输出应为“ 1 2 3 3 2 4 5 5 4 1”

表示“第一个开放括号,第二个开放,第三个开放,第三个开放的封闭括号,第二个开放的封闭,第四个开放...”等等

我已经尝试过使用堆栈,但是我不知道在打了第一个右括号之后该怎么做

这是我到目前为止所拥有的

#include <bits/stdc++.h>
using namespace std;

void check(string s){
    stack<char> a;
    char ch[s.length()];
    int done = 0;
    for (char tmp : ch){
        if (tmp == '('){
            a.push(tmp);
            cout<<a.size() + done<<" ";
        }
        if(tmp == ')'){
            a.pop();
            done++;
            cout<<a.size() + done<<" ";
        }
    }
}

main(){
    string s;
    getline(cin, s);
    check(s);
}

1 个答案:

答案 0 :(得分:1)

对于您要实现此代码的目的,将这样做:

void check(const std::string & string_){
    std::vector<bool> pars;
    std::string::size_type iterator = 0;
    for(const auto character : string_){
        if (character == '('){
            pars.push_back(true);
            std::cout << (iterator = pars.size()) << "  ";
        }
        else if (character == ')'){
            while(!pars[--iterator]);
            pars[iterator] = false;
            std::cout << iterator + 1 << "  ";
        }
    }
}

关键是直到最后都不要丢弃任何元素!但是只是在圆括号关闭时将它们标记为关闭。更不用说在括号打开时添加一个新元素。打开时的索引将是元素的数量,关闭时的索引将跳回到最后一个(仍然)打开的元素!

对于check("((())(()))");,结果将是1 2 3 3 2 4 5 5 4 1

对于check("((())(()))()()");,结果将是1 2 3 3 2 4 5 5 4 1 6 6 7 7 (顺便说一句,这种行为可以吗?)

但是check("))(()))()()");程序显然会由于向量索引无效而崩溃!

我想它可以解决,但是我想知道那是什么意思。可以使用负数吗?

我仍然建议您根据其 clear 逻辑使用以下形式:

#include <string>
void check(const std::string & string_){
    int counter = 0;
    for(const auto character : string_){
        if (character == '(') std::cout << ++counter;
        else if (character == ')') std::cout << --counter;
    }
    std::cout << std::endl;
}

将其称为check("((())(()))");的结果将是1232123210

祝你好运!