括号匹配

本文详细解析了使用栈解决括号匹配问题的算法,通过具体示例代码展示了如何判断括号序列是否正确配对,包括左右括号次序错误、括号数量不匹配等情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

括号匹配问题

char a[] = "(())abc{[(])}"; 左右括号次序匹配不正确

char a[] = "(()))abc{[]}"; 右括号多于左括号

char a[] = "(()()abc{[]}"; 左括号多于右括号

char a[] = "(())abc{}"; 左右括号匹配正确

题目分析

这是一道典型的用栈处理的题目,碰到左括号入栈,碰到右括号进行判断和出栈

#include "Stack.h"
#include <string.h>
#include <stdio.h>

void MatchBrackt(char* sequence, int size)
{
    Stack stack;
    StackInit(&stack);
    
    char ch;
    char leftBraket;
    for(int i = 0; i < size; i++)
    {
        ch = sequence[i];
        switch(ch)
        {
            case '(':
			case '[':
			case '{':
				StackPush(&stack, (StackDataType)ch);
				break;
			case ')':
			case ']':
			case '}':
			    if(StackEmpty(&stack))
			    {
			        printf("右括号多\n");
			        StackDestroy(&stack);
			        return;
			    }
			    leftBracket = (char)StackTop(&stack);
				StackPop(&stack);
				if (leftBracket == '(' && ch != ')') {
					printf("不匹配\n");
					return;
				}

				if (leftBracket == '[' && ch != ']') {
					printf("不匹配\n");
					return;
				}

				if (leftBracket == '{' && ch != '}') {
					printf("不匹配\n");
					return;
				}
			default:
				break;
        }
    }
    if(!StackEmpty(&stack))
    {
        printf("左括号多\n");
        return;
    }
    printf("匹配\n")
}

int main()
{
    const char * seqs[] = {
		"(())abc{[(])}",
		"(()))abc{[]}",
		"(()()abc{[]}",
		"(())abc{[]()}"
	};
	
	int sz = sizeof(seqs)/sizeof(seqs[0]);
	
	for(int i = 0; i < sz; i++)
	{
	    MatchBrackt(seqs[i],strlen(seqs[i]));
	}
    return 0;
}
  • 运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值