2009-07-09 79 views

回答

10

基於NSMutableArray實現隊列很容易,它可能在50行以下的代碼。

編輯:

了快速谷歌搜索發現這一點:

@interface Queue:NSObject { 
    NSMutableArray* objects; 
} 
- (void)addObject:(id)object; 
- (id)takeObject; 
@end 

@implementation Queue 

- (id)init { 
    if ((self = [super init])) { 
     objects = [[NSMutableArray alloc] init];  
    } 
    return self; 
} 

- (void)dealloc { 
    [objects release]; 
    [super dealloc]; 
} 

- (void)addObject:(id)object { 
    [objects addObject:object]; 
} 

- (id)takeObject { 
    id object = nil; 
    if ([objects count] > 0) { 
     object = [[[objects objectAtIndex:0] retain] autorelease]; 
     [objects removeObjectAtIndex:0]; 
    } 
    return object; 
} 

@end 
+1

1我清理代碼格式一點點,並且-takeObject方法。 – 2009-07-10 18:04:43

+0

在你的dealloc上添加一個[objects release]我會給你一個+1 – slf 2010-06-12 18:26:58

5

可可本身不具有Queue類,而且也沒有一個標準本身,而是有多種選擇,一個其中最適合您的需求。見this question(和my answer)。

就像你說的,你可以使用NSMutableArray推出自己的。如果你只需要一個quick'n'dirty隊列(並不擔心複製,編碼/解碼,枚舉等),那麼@Matt的解決方案是一個簡單的方法。你還應該考慮adding queue methods to NSMutableArray via a category,這很好,因爲你的「隊列」也是一個數組(所以你可以將它傳遞給NSArray參數),並且你可以免費獲得所有NS(可變)數組的功能。

如果性能很重要,我推薦使用更適合去除第一個元素的結構。出於這個原因,我爲自己的框架寫了CHCircularBufferQueue。 (不要試圖自吹自擂,只是爲了節省一些時間。)

1

我已經根據馬特橋代碼製作了一個只包含deque方法的類。

@interface NSMutableArray (ShiftExtension) 
// returns the first element of self and removes it 
-(id)shift; 
@end 

@implementation NSMutableArray (ShiftExtension) 
-(id)shift { 
    if([self count] < 1) return nil; 
    id obj = [[[self objectAtIndex:0] retain] autorelease]; 
    [self removeObjectAtIndex:0]; 
    return obj; 
} 
@end 
0

您可以使用C++標準庫中的STL隊列。

0

查看STL priority queue。它需要零線代碼,並且是便攜式的!你還能想要什麼?

0

你可以使用:NSArray的lastObject方法。下面是一個未經測試的例子:

Queue.h

#import <Foundation/Foundation.h> 

@interface Queue : NSObject 

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

@end 

Queue.m

#import "Queue.h" 

@interface Queue() 

@property(nonatomic, strong) NSMutableArray *backingArray; 

@end 

@implementation Queue 

-(id)init { 
    self = [super init]; 

    if (self) { 
     self.backingArray = [NSMutableArray array]; 
    } 
    return self; 
} 

-(void)enqueue:(id<NSObject>)object { 
    [self.backingArray addObject:object]; 
} 

-(id)dequeue { 
    id object = [self.backingArray lastObject]; 
    [self.backingArray removeObject:object]; 
    return object; 
} 

@end