给你一个长度为 N 的由’(‘和’)'组成的括号序列,你能找出这个序列中最长合法括号子序列么?合法括号序列是指,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为 10 的合法括号序列,而(()))( 则不是。
★数据输入
输入只有一行,是一个长度为 N(1<=N<=10^6)的由’(‘和’)'组成的括号序列。
★数据输出
输出两行。第 1 行表示最长合法括号序列的长度。第 2 行表示最长合法括号序列的个数。
如果没有合法括号序列输出 0和 1。
输入示例1
)((())))(()())
输出示例1
6
2
输入示例2
))(
输出示例2
0
1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MAXSIZE 1000000
typedef struct LNode *List;
/* 建立一个堆栈 */
struct LNode{
char str[MAXSIZE];
int Last; //栈顶指针
};
/* 入栈函数 */
bool Push(List L,char ch){
L->str[++(L->Last)] = ch;
return true;
}
/* 判断栈是否为空 */
bool IsEmpty(List L){
return (L->Last==-1);
}
/* 出栈函数 */
char Pop(List L){
return (L->str[(L->Last)--]);
}
/* 本程序中只有“(”入栈,“)”作为出栈的条件 */
int main(void){
List L = (List)malloc(sizeof(struct LNode));
L->Last = -1;
char ch;
int i,max = 0,xulie = 0,num = 0;
while((ch = getchar())!='\n'){
if(ch=='('){ //遇到"("把他压入栈
Push(L,ch);
}else if(ch==')'&&!IsEmpty(L)){ //遇到右括号且栈不为空
Pop(L); //弹出一个栈顶元素
xulie+=2; //合法括号序列长度 +2
}
if(xulie>max){ //当前括号序列长度大于最大括号序列长度
max = xulie; //更改最大有效括号序列长度
num = 1;
}
else if(xulie == max){ //有同等长度的序列
num++; //最长合法括号序列的个数 +1
}
if(IsEmpty(L)) //堆栈已空,把括号序列长度置 0
xulie = 0; //此时说明前面输入的“(”已经全部匹配完,把xulie置0以记录下一个合法的括号序列
}
if(max == 0){ //表示没有合法的括号序列
printf("0\n1\n");
}else{
printf("%d\n%d",max,num);
}
return 0;
}