目标C – 手动arraysFIFO队列

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

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]; 

采用FIFO方式的arrays:

 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]; } 

即使我不明白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程序实现队列