给你一个合法的括号序列,要求你按左括号下标递增顺序给出每对括号在序列中的下标。(下标从1开始)
//给你一串括号序列,需要你把每对括号的位置逐行标出来,从1开始数.
对于每组数据,第一行包括一个只包含'(',')'的字符串,保证输入的括号匹配序列合法,长度不超过100000
注释未完善,可能存在错误
#include <bits/stdc++.h>
using namespace std; //引入了C++标准库中的所有头文件,并使用了std命名空间
const int N = 100010; //const声明一个变量N,在初始化后不能被修改 N定义数组大小为100010
int a[N];
char s[N]; //a用于只存储匹配的)的坐标信息,s用于存储输入的字符串。
int main()
{
stack<int> st; //定义了一个栈名字叫st,用于存储(的索引。
while(~scanf("%s",s)){ //当 scanf 读取到EOF时,~scanf("%s",s) 的结果为0,循环终止。
int len = strlen(s); //命一个len存储字符串s的长度
for(int i = 0; i < len; i ++){ //对s数组遍历,命i为0,小于s长度,就+1
if(s[i] == '(') { //当第i个坐标读到(,就往栈st里面加
st.push(i + 1); //数组通常从0开始计数所以多加个1
//
}
else{ //没读到( 就进入else
int t = st.top(); //获取栈顶元素坐标记为t
st.pop(); //弹出栈顶元素(栈是先入后出)
a[t] = i + 1; //将当前索引i+1存入数组a中,位置由栈顶元素的值决定
}
}
for(int i = 1; i < len; i ++)
if(a[i]){ //
printf("%d %d\n",i,a[i]); //输出该 ( 坐标和对应的 ) 坐标
a[i] = 0; //打印完就将i重置为0
}
}
}