3

NSMutalbleArray を使用せずに手動配列を作成する最善の方法を考えているだけですが、考えられる最善の解決策を研究していますが、エレガントな答えがなければどう思いますか? 最終的な解決策として FIFO キューを使用すると、基本的な配列構造でさえ大きなヒントになります! ありがとう、ジョン

4

3 に答える 3

16

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];
于 2012-10-29T20:41:19.720 に答える
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 キューを実装するプログラム

于 2012-10-29T22:06:12.837 に答える