括号匹配

题目描述:

PIPI给你一个合法的括号序列,希望跟你按左括号下标递增顺序给出每对括号在序列中的下标。(下标从1开始)


 

输入:

多组数据

第一行包括一个只包含'('和')'的字符串,保证输入的括号匹配序列合法,长度不超过100000


 

输出:

按左括号下标递增顺序给出每对括号在序列中的下标。


 

样例输入:

(())()()


 

样例输出:

1  4

2  3

5  6

7  8


 

这道题,需要给出括号匹配的结果,我们先不管输出的时候需要按照递增的顺序,现在先只考虑,如何才能够是的括号“匹配”起来?这个时候我们很容易想到一种数据结构,对,那就是栈。我们可以先把例如一种括号存到栈里,例如选择“)”,只要遇到这个右括号,不管三七二十一,全部丢到栈里先存起来,然后,一旦遇到"(",我就让栈弹出一个元素,然后再操作一番,就可以使得括号匹配起来。现在我们来看看具体实现:

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <iostream>
 3 #include <stack>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 struct store {
 8     int left;
 9     int right;
10 };
11 char str[100000];
12 
13 int main()
14 {
15     stack<store>s1;
16     store temp, result;
17     stack<int>s2;
18     while (scanf("%s", str) > 0)
19     {
20         for (int i = strlen(str) - 1; i >= 0; i--) {
21             if (str[i] == ')') {
22                 s2.push(i + 1);
23             }
24             else if (!s2.empty()) {
25                 temp.left = i + 1;
26                 temp.right = s2.top();
27                 s1.push(temp);
28                 s2.pop();
29             }
30         }
31         int size = s1.size();
32         for (int j = 0; j < size; j++) {
33             result = s1.top();
34             printf("%d %d\n", result.left, result.right);
35             s1.pop();
36         }
37     }
38     return 0;
39 }

可以看到,为了实现括号匹配且输出按照递增顺序,我们可以两次利用栈的性质。

首先,为了方便输出,我们可以先定义一个结构体,这个结构体存了两个数据,其实就是括号匹配中左右括号的序列。

在对字符串做处理时,我先从最后一个开始,若是右括号,只需要循环变量加1,就是其对应的序列,然后放到栈中,继续判断下一个字符。如果是左括号,那么这个时候就可以存储序列了,左右序列存储方式很简单,分别是循环变量加1和取得栈顶元素。然后,我把这个东西存到新的栈里,根据栈的性质,第一个存入栈中的恰好对应左括号序列的最大值者。等到全部处理完毕后,我先取得这个栈的容量大小,然后取得栈顶元素,打印,抛出...这个时候,打印的第一个元素,就是最后存入栈中的元素,也就是左括号序列最小的元素。目的也就达成了。

 

 

posted @ 2021-07-09 09:13  EvanTheBoy  阅读(264)  评论(0编辑  收藏  举报