以字符串形式打印开括号和闭括号的订单号 例如 ”((())(()))” 输出应为“ 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);
}
答案 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
祝你好运!