Objective C - 手动阵列FIFO队列

时间:2012-10-29 20:35:42

标签: objective-c ios arrays

只是想知道创建手动数组的最佳方法,不使用NSMutalbleArray,我一直在研究最好的解决方案,但没有优雅的答案,你怎么看,在Objective C中,什么是从中创建NSMutableArray样式对象的最佳方法刮? 使用FIFO队列作为最终解决方案,即使是基本的阵列结构也是一个很好的提示!谢谢, 约翰

3 个答案:

答案 0 :(得分:15)

NSMutableArray上的类别是IMO最简单的方法。我有一个堆栈类(LIFO)和队列(FIFO)

标题

#import <Foundation/Foundation.h>

@interface NSMutableArray (QueueStack)
-(id)queuePop;
-(void)queuePush:(id)obj;
-(id)stackPop;
-(void)stackPush:(id)obj;
@end

实施

#import "NSMutableArray+QueueStack.h"

@implementation NSMutableArray (QueueStack)
// Queues are first-in-first-out, so we remove objects from the head
-(id)queuePop {
  @synchronized(self)
  {
    if ([self count] == 0) {
        return nil;
    }

    id queueObject = [[[self objectAtIndex:0] retain] autorelease];

    [self removeObjectAtIndex:0];

    return queueObject;
  }
}

// Add to the tail of the queue
-(void)queuePush:(id)anObject {
  @synchronized(self)
  {
    [self addObject:anObject];
  }
}

//Stacks are last-in-first-out.
-(id)stackPop {
  @synchronized(self)
  {
    id lastObject = [[[self lastObject] retain] autorelease];

    if (lastObject)
        [self removeLastObject];

    return lastObject;
  }
}

-(void)stackPush:(id)obj {
  @synchronized(self)
  {
    [self addObject: obj];
  }
}
@end

制作和使用队列:

NSMutableArray *queue = [NSMutableArray array];

//Put an item in the queue
[queue queuePush:myObj];

//Retrieve an item, (this will be the first one)
MyCoolObject *myObject = [queue queuePop];

答案 1 :(得分:2)

具有FIFO方式的数组:

if (mutArr.count == 5) {
        for (int j = 0; j < 4; j++) {
            [mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
        }
        [mutArr removeObjectAtIndex:4];
        [mutArr addObject:mutDict];
    }else{
        [mutArr addObject:mutDict];
    }

答案 2 :(得分:1)

即使我不理解NSMutableArray的问题,这里有一种方法可以使用双向链表实现队列(希望我做对了,我有点累了;)):

注意:我假设使用ARC。

//Node.h
@interface Node : NSObject

@property (strong)id value;
@property (strong)Node *previous;
@property (strong)Node *next;


//Node.m
@implementation
@end


/Queue.h
@interface Queue : NSObject

- (void)enqueue:(id)objectToEnqueue;
- (id)dequeue;

@end

//Queue.m
@interface Queue ()
{
    Node *start;
}

@implementation

- (void)enqueue:(id)objectToEnqueue
{
    Node *node = [Node new];
    node.value = objectToEnqueue;

    if (nil == start)
    {
        node.previous = node;
        node.next = node;
        start = node;
    }
    else
    {
        node.previous = start.previous;
        node.next = start;
        start.previous = node;
        start = node;
    }
}

- (id)dequeue
{
    if (nil == start)
        return nil;

    Node *node = start.previous;

    start.previous = start.previous.previous;
    start.previous.next = start;

    id objectToDequeue = node.value;

    return objectToDequeue;

}
@end

如果你正在寻找一种在纯C中做到这一点的方法,也许这会对你有帮助:

C PROGRAM TO IMPLEMENT A QUEUE