Object-c 符号匹配的实现

  • 基本思想:

对于读入的字符串,按顺序依次读取一个字符,如果该字符为左分隔符,则将其存入栈中。如果发现一个右分隔符,则与栈中弹出的元素相比较。如果二者相互匹配,则继续处理将标志match修改为true。反之中断处理并提示出错同时将标志macth修改为fasle。到达字符串末尾时检测栈是否为空与标志的状态得到匹配的最终结果

BOOL result = stack.isEmpty() && match
  • 核心代码如下:
-(BOOL)match:(NSString *)str{
    BOOL result = false;
    if (str) {
        if (!self.stack) {
            self.stack = [[Stack alloc] initWithSize:[str length]];
        }
        for(int i = 0;i < [str length]; i++){
           NSString *ch = [str substringWithRange:NSMakeRange(i,1)];
            NSLog(@"34-----------:%@",ch);
            if ([ch isEqualToString:@"["] || [ch isEqualToString:@"("] || [ch isEqualToString:@"{"]) {
                [self.stack push:ch];
                [self.stack test];
            }else if([ch isEqualToString:@"]"] || [ch isEqualToString:@")"] || [ch isEqualToString:@"}"]){
                if(![self.stack isEmpty]){
                    NSString* leftChar = (NSString*)[self.stack pop];
                    if ([ch isEqualToString:@")"] && [leftChar isEqualToString:@"("]) {
                        NSLog(@"41-------()匹配成功进行下一次匹配");
                        result = true;
                        continue;
                    }else if ([ch isEqualToString:@"]"] && [leftChar isEqualToString:@"["]) {
                        NSLog(@"44-------[]匹配成功进行下一次匹配");
                        result = true;
                        continue;
                    }else if ([ch isEqualToString:@"}"] && [leftChar isEqualToString:@"{"]) {
                        NSLog(@"44-------[]匹配成功进行下一次匹配");
                        result = true;
                        continue;
                    }else{
                        result = false;
                        NSLog(@"48-------匹配失败,待匹配的元素情况为:出栈元素:%@,遍历到的元素为:%@",leftChar,ch);
                        [self.stack test];
                    }
                }else{
                    result = false;
                    NSLog(@"55-------匹配失败,多了字符:%@",ch);
                }
            }
        
        }
        if ([self.stack isEmpty] && result) {
            NSLog(@"64-------匹配成功");
        }else{
            NSLog(@"66-------匹配失败");
        }
        
    }
    
    return [self.stack isEmpty] && result;
}
  • 测试接口:
[self.delimiterMatch match:@"(liu{09f[0]9-=)"];
  • 实验失败例子:
    image.png

*实验成功例子:

[self.delimiterMatch match:@"(liu{09f[0]9-}=)"];

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值