• 算法-链表实现栈


    链表是一种递归的数据结构,它或者为空(null),或者只想一个节点(node)的引用,改节点包含了一个对象和执行另外一条链表的引用,节点可能是包含任意数据数据的抽象尸体,包含的只想节点的应用显示了它在链表之中的作用。相比数组来说有更多的灵活性, 本文就简单的用链表实现一下栈,栈的最大的特点就是后进先出,队列是先进先出,两者不太一样,本文将简单的用OC实现栈。

    Node定义:

    @interface Node : NSObject
    
    @property  (strong,nonatomic)  NSString  *value;
    
    @property  (strong,nonatomic)  Node  *next;
    
    @end
    

     Stack头文件定义:

    @interface Stack : NSObject
    //栈顶的元素
    @property  (strong,nonatomic) Node  *first;
    
    @property  (assign,nonatomic) NSInteger  count;
    
    -(BOOL)isEmpty;
    
    -(NSInteger)size;
    
    -(void)push:(NSString *)value;
    
    -(NSString *)pop;
    
    -(void)remove:(NSString *)value;
    
    @end
    

    其中有三个主要的实现方法,入栈(push),出栈(pop),删除(remove),需要注意的是本文中的删除是单向链表的删除,如果删除最后一个,时间复杂度和链表的长度有关系,我们可以采用双向链表,有兴趣的可以研究一下。

    Stack.m的实现代码:

    @implementation Stack
    
    -(BOOL)isEmpty{
        return self.count==0;
    }
    
    -(NSInteger)size{
        return self.count;
    }
    
    -(void)push:(NSString *)value{
        Node  *oldFirst=self.first;
        self.first=[[Node alloc]init];
        self.first.value=value;
        self.first.next=oldFirst;
        self.count=self.count+1;
    }
    
    -(NSString *)pop{
        if (!self.first) {
            return [NSString stringWithFormat:@"-1"];
        }
        NSString *value=self.first.value;
        self.first=self.first.next;
        self.count=self.count-1;
        return value;
    }
    
    -(void)remove:(NSString *)value{
        if ([self.first.value isEqualToString:value]) {
            self.first=self.first.next;
            self.count=self.count-1;
        }else{
            Node *node=self.first;
            while (node.next) {
                if ([node.next.value isEqualToString:value]){
                    if (node.next.next) {
                        Node *tempNode=node.next.next;
                        node.next=tempNode;
                    }else{
                        node.next=NULL;
                    }
                    self.count=self.count-1;
                    break;
                }else{
                    node=node.next;
                }
               
            }
        }
    }
    
    @end
    

    测试代码:

            Stack  *stack=[[Stack alloc]init];
            Node *first=[[Node alloc]init];
            first.value=@"iOS技术交流群:228407086";
            first.next=NULL;
            stack.first=first;
            [stack push:@"FlyElephant"];
            [stack push:@"博客园"];
            [stack push:@"keso"];
            [stack remove:@"FlyElephant"];
            NSLog(@"出栈:%@",stack.pop);
            NSLog(@"出栈:%@",stack.pop);
            NSLog(@"出栈:%@",stack.pop);
            NSLog(@"出栈:%@",stack.pop);
    

    效果如下:

  • 相关阅读:
    npm脚本和package.json
    Vue官方文档笔记(二)
    Vue官方文档笔记
    2019windows上安装Mac OS 10.14过程详细截图
    三次握手四次挥手
    ==和equals的区别
    Stringbuffer和Stringbuilder的区别
    字符串拼接五种常用方法
    什么是线程以及保证线程安全
    什么是线程安全,怎样保证线程安全
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4558408.html
Copyright © 2020-2023  润新知