栈的应用--括号匹配问题

本文介绍了一种基于栈的数据结构方法来解决括号匹配问题,通过遍历输入字符串,对左括号进行进栈,遇到右括号时检查栈顶括号是否与其匹配,最后判断栈是否为空。实例展示了如何在Objective-C中编写实现该算法的代码。
摘要由CSDN通过智能技术生成

括号匹配问题:给一个字符串,其中包括小括号、中括号、大括号.求该字符串中的括号是否匹配?

例如:

()()[]{}      --> 匹配

([{()}])      --> 匹配

[]{            --> 不匹配

[(]]          --> 不匹配

这里可以借助栈的思想来做:

1.遍历字符串:从左边开始,如果是字符是左括号“(”、“[”、“{”,则进行进栈操作

2.如果字符是右括号“)”、“]”、“}”

         2.1.先判断栈是否为空? 为空,则不匹配;不为空,则进行2.2.

         2.2.取出栈顶,看看栈顶的字符是否与右括号匹配,如果匹配,则移除栈顶,如果不匹配,则结果不匹配.

 (PS:注意,右括号仅用来做判断,不会进行进栈出栈操作)

      2.3.如果都不符合2.1、2.2 的情况,则不匹配

3.最后判断栈是否为空,为空则说明匹配,不为空则说明不匹配

算法解答:

这里用数组(NSMutableArray)代替栈(Stack),便于理解,原理请看我上一篇文章:CSDN

判断的代码如下:

- (BOOL)brace_match:(NSString *)str
{
    NSMutableArray * resultArray = [NSMutableArray array];
    NSDictionary * dic = @{@"}":@"{",@"]":@"[",@")":@"("};
     //将字符串分割成单个字符并转为数组(可以看我上一篇文章的描述)
    NSMutableArray * strArray = [self separateString:str];
    
    for (NSString * ch in strArray)
    {
        if ([ch isEqualToString:@"{"] || [ch isEqualToString:@"["] || [ch isEqualToString:@"("])
        {
            [resultArray addObject:ch];
            
        }else{
            
            if (resultArray.count == 0)
            {
               return false;
            }else if ([[resultArray lastObject] isEqualToString:[dic objectForKey:ch]]){
            
                [resultArray removeObject:[resultArray lastObject]];
            }else{
                return false;
            }
        }
    }
    
    if (resultArray.count == 0)
    {
        return YES;
    }else{
        return false;
    }
}

将字符串分割成单个字符并转为数组 代码:

(可以看我上一篇文章的描述:CSDN)

#pragma mark 将字符串分割成单个字符
- (NSMutableArray *)separateString:(NSString *)str
{
    NSMutableArray * resultArray = [[NSMutableArray alloc]init];
    
    for (int i = 0; i < str.length ; i ++)
    {
        NSRange range = NSMakeRange(i, 1);
        NSString * singleStr = [str substringWithRange:range];
        //将分割好的单个字符装进数组
        [resultArray addObject:singleStr];
    }
    
    return  resultArray;
}

最后验证一下:

NSString * braceStr = @"()[]{([])}";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 YES */
    
NSString * braceStr = @"()[]{(";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 false */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值