zoj 2704 Brackets
输出最长的配对序列,brackets—括号
忘了当时怎么讨论的了,总之用栈来存储
序列的对应的标号,标号差值与序列的长
度相关,然后从small 到big输出,只知道
当时很纠结
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define maxn 100000
char target[maxn+10];
int stack[maxn+10];
int top; //栈顶的元素的下标
void push(int x) //入栈
{
stack[top] = x;
}
void pop() //出栈
{
stack[top] = 0;
}
int match(int m,int n) //检查是否匹配
{
if(target[ stack[m] ] == '(' && target[n] == ')')
return 1;
if(target[ stack[m] ] == '[' && target[n] == ']')
return 1;
else
return 0;
}
int main()
{
int i,len,max,big,small;
while(scanf("%s",target)==1)
{
len = strlen(target);
top = 0;
push(len); //栈底元素,判断栈是否为空
top = 1;
push(0); //target的首号元素下标
for(i=1;i<len;i++)
{
if(match(top,i))
{
pop();
top--;
}
else
{
top++;
push(i);
}
}
if(top == 0)
printf("%s\n\n",target);
else if(top == len)
printf("\n\n");
else if(top>0&&top<len)
{
stack[0] = -1;
max = 0;
big = 0;
small = 0;
int m;
stack[top+1] = len;
for(i=1;i<=top+1;i++)
{
if((m = stack[i] - stack[i-1]) > max)
{
max = m;
big = stack[i];
small = stack[i-1];
}
}
for(i=small+1;i<big;i++)
printf("%c",target[i]);
printf("\n\n");
}
}
return 0;
}
posted on 2011-08-17 16:47 java课程设计例子 阅读(121) 评论(0) 编辑 收藏 举报