美文网首页
ios 栈来解决平衡符号的问题

ios 栈来解决平衡符号的问题

作者: timeQuick | 来源:发表于2019-04-21 19:29 被阅读0次

    前言

    之前去面试遇到一个面试题,意思大概是这样的:检测括号是否成对,每一个右花括号)、右方括号]、右大括号},必然要对应一个相应的左花括(号、左方括号[以及左大括号{。也就是说

    序列:
    [({})]是合法的
    {([})]不合法
    {}合法
    {[(])}不合法

    用程序写逻辑检测这些字符串。

    当时没学栈的时候,一脸懵逼,其实上面的题用栈的就能很好解决。
    什么是栈
    栈(stack)又名堆栈,它是一种运算受限的线性表。
    栈的特性:后进先出(Last In First Out)
    栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
    用ios oc语法数组实现一个简单的栈,来解决平衡符号问题。

    算法可以描述如下:
    做一个空栈,如果字符是一个开放字符,则将其推入栈中。如果字符是一个封闭符号与栈顶元素匹配,匹配上就出栈。如果栈为空则括号合法,否则不合法(还有没成队的括号t符)。

    .h实现

    #import <Foundation/Foundation.h>
    NS_ASSUME_NONNULL_BEGIN
    
    
    //用数组对栈的简单实现
    
    @interface DataStack : NSObject
    
    //入栈
    -(void)push:(id)obj;
    
    //出栈
    -(void)pop;
    
    //栈是否为空
    -(BOOL)isEmpty;
    
    //返回栈顶元素
    -(id)topObj;
    
    //从栈顶开始打印元素
    -(void)printStackObj;
    
    //清栈元素
    -(void)clearStack;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    .m实现

    #import "DataStack.h"
    
    
    //把数组的最后一个元素当作栈顶,来操作。
    @interface DataStack ()
    @property (nonatomic,strong) NSMutableArray * datas;
    
    @end
    
    
    
    @implementation DataStack
    
    -(instancetype)init
    {
        self = [super init];
        if (self) {
            self.datas = [NSMutableArray array];
           
        }
        return self;
    }
    
    //入栈
    -(void)push:(id)obj
    {
        [self.datas addObject:obj];
    }
    
    //出栈
    -(void)pop
    {
        if (self.datas.count == 0) {
            return;
        }
       
        [self.datas removeLastObject];
      
    }
    
    //栈是否为空
    -(BOOL)isEmpty
    {
        BOOL empty = (self.datas.count == 0)?YES:NO;
        return empty;
    }
    
    //返回栈顶元素
    -(id)topObj
    {
        return self.datas.lastObject;
    }
    
    //清栈
    -(void)clearStack
    {
        [self.datas removeAllObjects];
    }
    
    //从栈顶开始打印元素
    -(void)printStackObj
    {
        NSLog(@"从栈顶打印元素:");
        [self.datas enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"栈元素  :%@",obj);
        }];
    }
    
    @end
    

    在vc中测试

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        NSString * str1 = @"[({})]";
        NSString * str2 = @"{([})]";
        NSString * str3 = @"{[]()}";
         self.stack = [[DataStack alloc] init];
        
        [self inputString:str1];
        [self.stack clearStack];
        
        [self inputString:str2];
        [self.stack clearStack];
        
        [self inputString:str3];
        [self.stack clearStack];
    }
    
    
    -(void)inputString:(NSString *)str
    {
        if (str.length == 0) {
            return ;
        }
        NSLog(@"输入的平衡符号:%@",str);
        NSString * singleStr = @"";
        NSString * combineStr = @"";
        
        //单个字符匹配
        for (NSInteger i = 0; i < str.length; i++) {
            NSRange   range =  NSMakeRange(i, 1);
            singleStr = [str substringWithRange:range];
            
            //如果是左边的符号就入栈,否则就和栈顶匹配
            if ([singleStr isEqualToString:@"{"]||[singleStr isEqualToString:@"["]||[singleStr isEqualToString:@"("]) {
                [self.stack push:singleStr];
            }else{
                //这里如果与栈顶d元素匹配就 出栈
                combineStr = [NSString stringWithFormat:@"%@%@",[self.stack topObj],singleStr];
                if ([combineStr isEqualToString:@"()" ]||[combineStr isEqualToString:@"[]" ]||[combineStr isEqualToString:@"{}" ]) {
                    [self.stack pop]; //出栈
                }
            }
        }
        
        //看是否是空栈来判断 输入的平衡符是否正确
        if ([self.stack isEmpty])
        {
            NSLog(@"平衡符号的输入顺序完全正确!");
        }else{
            NSLog(@"平衡符号的输入顺序错误了!=====");
        }
    
    }
    
    

    最后

    打印输出 :


    结果.png

    总结:了解了栈---数据结构。

    相关文章

      网友评论

          本文标题:ios 栈来解决平衡符号的问题

          本文链接:https://www.haomeiwen.com/subject/empcgqtx.html