美文网首页iOS
iOS 实现一个栈 使用数组 (二)

iOS 实现一个栈 使用数组 (二)

作者: wealon | 来源:发表于2022-01-21 21:54 被阅读0次

iOS 实现一个栈 这个栈是线程安全的

线程的安全使用GCD的信号量 dispatch_semaphore_t 。

MyStack.h

@interface MyStack : NSObject

- (void)push:(id)obj;

- (id)pop;

- (id)peek;

@end

MyStack.m

#import "MyStack.h"

#define kStackSize  10

@interface MyStack ()

@property (nonatomic, strong) NSMutableArray *list;

@property (nonatomic, assign) NSInteger size; // the number of stack elements

@property (nonatomic, strong) dispatch_semaphore_t semaphore;  // 信号量  锁

@end

@implementation MyStack

- (instancetype)init
{
    self = [super init];
    if (self) {
        
        self.list = [NSMutableArray arrayWithCapacity:kStackSize];
        self.size = 0;
        self.semaphore = dispatch_semaphore_create(1);
        
    }
    return self;
}

- (void)push:(id)obj
{
    if ([self isFull] || !obj) return;
    
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    [self.list addObject:obj];
    self.size++;
    dispatch_semaphore_signal(self.semaphore);
}

- (id)pop
{
    if ([self isEmpty]) return nil;
    
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    id obj = [self.list objectAtIndex:self.size -1];
    [self.list removeObjectAtIndex:self.size - 1];
    self.size--;
    dispatch_semaphore_signal(self.semaphore);
    return obj;
}

- (id)peek
{
    if ([self isEmpty]) return nil;
    
    id obj = [self.list objectAtIndex:self.size -1];
    return obj;
}

- (BOOL)isEmpty
{
    return self.size == 0;
}

- (BOOL)isFull
{
    return self.size == kStackSize;
}

@end

测试代码

MyStack *stack = [[MyStack alloc] init];

[stack push:@(1)];
[stack push:@(2)];
[stack push:@(3)];

NSLog(@"%@", [stack peek]);

NSLog(@"%@", [stack pop]);
NSLog(@"%@", [stack pop]);
NSLog(@"%@", [stack pop]);
NSLog(@"%@", [stack pop]);

输出结果

2022-01-21 21:52:04.782525+0800 MyStack[15061:347654] 3
2022-01-21 21:52:04.783088+0800 MyStack[15061:347654] 3
2022-01-21 21:52:04.783163+0800 MyStack[15061:347654] 2
2022-01-21 21:52:04.783226+0800 MyStack[15061:347654] 1
2022-01-21 21:52:04.783247+0800 MyStack[15061:347654] (null)

相关文章

  • iOS 实现一个栈 使用数组(一)

    iOS 实现一个栈 苹果的Cocoa并没有暴露系统的栈结构 ,这里根据栈的特点,使用数组实现了一个简单的栈。 My...

  • [算法题] 使用数组实现栈和队列

    1. 使用数组实现栈 2. 使用数组实现队列

  • iOS 实现一个栈 使用数组 (二)

    iOS 实现一个栈 这个栈是线程安全的 线程的安全使用GCD的信号量 dispatch_semaphore_t ...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • 栈——使用数组实现栈(数组栈)

    一.简介   栈是一种LIFO结构,使用数组头部添加元素的时间复杂度是O(n),而向尾部添加元素或删除元素的时间复...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • js常用算法

    数组去重: 阶乘 生成菲波那切数列 二分查找 实现栈的功能 定义一个栈 实现栈的pop,push 实现链表的fin...

  • 用数组实现栈、队列

    用数组实现一个栈 用数组实现一个队列 用单链表实现给队列

  • 算法

    iOS冒泡排序、插入排序、选择排序、快速排序、二分查找用数组实现栈和队列专题:菲波那切数列与递归

  • python使用数组实现一个栈的数据结构

    1.使用数组实现一个栈的数据结构,要求具有以下方法:压栈:在栈顶插入元素弹栈:弹出栈顶元素获取栈顶元素判断栈是否为...

网友评论

    本文标题:iOS 实现一个栈 使用数组 (二)

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