pipioj-1036:括号匹配

给你一个合法的括号序列,要求你按左括号下标递增顺序给出每对括号在序列中的下标。(下标从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
            }
         
    }
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值