首页 > 编程语言 > 详细

括号匹配(两种算法的完成)

时间:2020-12-29 08:32:07      阅读:29      评论:0      收藏:0      [点我收藏+]

一个已知括号组的完成,作为一个大函数,只要在原来数组基础上找到一个个括号组,再处理即可,可是时间复杂度比较高,计算时间比较长。
这里可以采用数据结构栈。
其实左括号就是入栈,右括号就是出栈,不过不能直接弹出,因为输出有要求,必须按照左括号的大小,所以要再用一个数组接住右括号作为序号,这样就完成排序。

include <stdio.h>

#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 <stdio.h>

#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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!