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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章