括号匹配
题目描述:
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和取得栈顶元素。然后,我把这个东西存到新的栈里,根据栈的性质,第一个存入栈中的恰好对应左括号序列的最大值者。等到全部处理完毕后,我先取得这个栈的容量大小,然后取得栈顶元素,打印,抛出...这个时候,打印的第一个元素,就是最后存入栈中的元素,也就是左括号序列最小的元素。目的也就达成了。