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

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 实现一个栈 使用数组 (二))