一个已知括号组的完成,作为一个大函数,只要在原来数组基础上找到一个个括号组,再处理即可,可是时间复杂度比较高,计算时间比较长。
这里可以采用数据结构栈。
其实左括号就是入栈,右括号就是出栈,不过不能直接弹出,因为输出有要求,必须按照左括号的大小,所以要再用一个数组接住右括号作为序号,这样就完成排序。
#include <string.h>
void do_one(char a[],int head,int leap)
{
int remark_array[10001]={0};
for(int i=0;i<leap-head;i++) remark_array[i]=i+1;
int result_array[10001][2]={0};
int p=0;
int sort_array[10001]={0};
int right_now_location;
int left_location;
for(int j=head;j<leap;j++)
{
if(a[j]==‘)‘)
{
right_now_location=j;
left_location=j-1;
while(remark_array[left_location]<0)
{
left_location--;
}
result_array[p][0]=left_location+1;
result_array[p][1]=right_now_location+1;
p++;
remark_array[left_location]=-1;
remark_array[right_now_location]=-1;
}
}
int mid_array[10001][2];
for(int i=0;i<(leap-head)/2;i++)
for(int j=0;j<2;j++)
mid_array[i][j]=result_array[i][j];
int min_num=0;
int min;
for(int i=0;i<p;i++)
{
int min=result_array[0][0];
min_num=0;
for(int j=1;j<p;j++)
{
if(result_array[j][0]<min)
{
min=result_array[j][0];
min_num=j;
}
}
sort_array[i]=min_num;
result_array[min_num][0]=100001;
}
for(int i=0;i<(leap-head)/2;i++)
{
int n=sort_array[i];
printf("%d %d\n",mid_array[n][0],mid_array[n][1]);
}
}
int main()
{
char a[100001]={‘\0‘};
while((scanf("%s",a))!=EOF)
{
int head=0,leap=0;
int sum=0;
sum=strlen(a);
int left_num=0;
for(int i=0;i<sum;i++)
{
if(a[i]==‘(‘)
{
leap++;
left_num++;
}
if(a[i]==‘)‘)
{
leap++;
left_num--;
}
if(left_num==0)
{
do_one(a,head,leap);
head=leap;
}
}
}
}
下面用栈实现,代码比较简单
#include <string.h>
#define STACKDEPTH 100000
int stack[STACKDEPTH];
int top=0;
void push(int data)
{
stack[top++] = data;
}
int pop()
{
return stack[--top];
}
int main()
{
char str[100000];
while(scanf("%s",str)!=EOF)
{
int pos[100000]={0};
int len1 = strlen(str);
for(int i=0;i<len1;i++)
{
if(str[i]==‘(‘)
push(i+1);
else if(str[i]==‘)‘)
{
pos[pop()]=i+1;
}
else
;
}
for(int i=0;i<100000;i++)
{
if(pos[i]!=0)
{
printf("%d %d\n",i,pos[i]);
}
}
}
return 0;
}
原文:https://www.cnblogs.com/tzp-empty-hya/p/14204454.html