栈的应用—括号匹配

389 阅读3分钟

括号匹配问题是指:假设表达式中有二种括号,圆括号和方括号,镶嵌顺序随意,现检验括号是否匹配。
例如:([]())[([][])] 为正确格式; [(]或([())或(()]是错误格式

算法思想从左向右依次扫描给定序列,如果遇到左括号进栈;如果遇到右括号需要进行以下判断:

  • 栈空:匹配失败,说明没有与之对应的左括号
  • 栈不空,取栈顶元素不匹配:匹配失败,说明左右括号不配对
  • 栈不空,取栈顶元素匹配:这一对匹配成功,继续进行下一对

另外如果扫描到最后,栈中还有元素,这说明没有与之对应的右括号,匹配失败

思路图如下:

图片.png


示例
匹配成功
请添加图片描述
左右不匹配
请添加图片描述
没有对应的左括号
请添加图片描述

没有对应的右括号

请添加图片描述

代码:

#define MaxSize 10
typedef struct
{
	char data[MaxSize]; 
	int top;
}SqStack;

void InitStack(SqStack& S);//初始化
void StackEmpty(SqStack S);//判空
void Push(SqStack& S,char x);//入栈
void Pop(SqStack& S,char& x);//出栈


bool Check(char str[],int len)
{
	SqStack S;
	InitStack(S); //初始化一个栈 
	for(int i=0;i<len;i++)
	{
		if(str[i]=='(' || str[i]=='[' || str[i]=='{')//扫描到左括号入栈
			Push(S,str[i]);
		else//扫描到右括号
		{
			if(StackEmpty(S))//栈空,没有与之对应的左括号
				return false;
			char top;
			Pop(S,top);//拿出栈顶元素判断
			if(//这三种都属于左右括号不匹配情形
				(str[i]==')' && top!='(') || 
				(str[i]==']' && top!='[')||
				(str[i]=='}' && top!='{') 
			  )
			  return false;
		}
	}
	//扫描完成,且栈空了,表明匹配成功,  
	return StackEmpty(S);
}

下面是全部代码实现:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

/*定义顺序栈*/
typedef char elemtype;
typedef struct SequenStack
{
    char data[MAXSIZE];
    int top;
}SequenStack;

//初始化 
SequenStack * Init_SequenStack()
{
    SequenStack * S;
    S = (SequenStack *)malloc(sizeof(SequenStack));

    if (S == NULL)
    {
        return S;
    }
    S->top = -1;
    return S;
}

/* 判空栈(顺序栈)*/
int SequenStack_Empty(SequenStack * S)
{
    if (S->top == -1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/* 入栈(顺序栈) */
int Push_SequenStack(SequenStack * S, char x)
{
    if (S->top >= MAXSIZE-1)
    {
        return 0;
    }
    S->top++;
    S->data[S->top] = x;
    return 1;
}

/* 出栈(顺序栈) */
int Pop_SequenStack(SequenStack * S, char * x)
{
    if (S->top == -1)
    {
        return 0;
    }
    else
    {
        S->top--;
        *x = S->data[S->top+1];
        return 1;
    }
}

int Check(char str[],int len)
{
     SequenStack * S = Init_SequenStack(); //初始化一个栈 S
	for(int i=0;i<len;i++)
	{
		if(str[i]=='('|| str[i]=='[' || str[i]=='{')//扫描到左括号入栈
			Push_SequenStack(S,str[i]);
		else//扫描到右括号
		{
			if(SequenStack_Empty(S))//栈空,没有与之对应的左括号
				return 0;
			else{
			char topelem;
			Pop_SequenStack(S,&topelem);//拿出栈顶元素判断
			//这三种都属于左右括号不匹配情形
			if(str[i]==')'&&topelem!='(')return 0;
			if(str[i]=='}'&&topelem!='{')return 0;
			if(str[i]==']'&&topelem!='[')return 0;
		        }
		}
	}
	//扫描完成,且栈空了,表明匹配成功,  
	return SequenStack_Empty(S);
}


int main()
{
//	int len; //输入几个括号
//	char str[len]; //定义括号字符数组 
//	
//	printf("输入你的括号个数:\n");
//		scanf("%d",&len);
//	
//	printf("输入你的括号组合:\n");
//	for(int i=0;i<len;i++)
//	{
//		scanf("%c",&str[i]);
//	}
//	printf("查看是否规范:\n");
//	if(Check(str,len))
//	printf("规范:\n");
//	else
//		printf("不规范:\n"); 


    int j=0;char x;
	char g[MAXSIZE]; //括号字符数组 
	memset(g,'\0',MAXSIZE); //全部开始后赋值为\0 
	
	printf("输入你的括号组合(以!结尾):\n");
	scanf("%c",&x);
	while(x!='!')
	{
		g[j]=x;
		j++;
		scanf(" %c",&x);
	}
	
	printf("括号组合是否规范:  ");
	if(Check(g,j))printf("是\n");
	else printf("否\n");

		return 0;
}

图片.png

图片.png


参考: