ios 目标C -手动阵列FIFO队列

cnh2zyt3  于 2023-03-20  发布在  iOS
关注(0)|答案(3)|浏览(185)

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

rmbxnbpk

rmbxnbpk1#

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

xxb16uws2#

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

w3nuxt5m3#

尽管我不理解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

相关问题