Stack & Queue in Objective-C

วันนี้ผมต้องเขียนโปรแรกมโดยใช้ queue ผมก็พยายามหานะว่า มันใช้ class ไหน  แต่หายังไงก็หาไม่เจอ สุดท้ายแล้วก็ค้นพบว่า ในภาษา objective-c นั้นมี class จำพวก container หลายตัวให้เลือกใช้ ตั้งแต่ array , dictionary , set แต่กลับไม่มี stack และ queue

ก็ในเมื่อมันไม่มีให้ใช้ แล้วคำถามต่อไปคือ เราต้องเขียน เองใหม่ทั้งหมดเลยหรือ ?

คำตอบคือไม่ครับ เราไม่ต้องไปเขียน class  เหมือนกับ NSMutableArray , NSDictionary อะไรแบบนั้นเองทั้งหมด แต่สิ่งที่เราต้องทำก็คือ นำคุณสมบัติของภาษา objective-c มาใช้นั่นก็คือ class extend ครับ ถูกต้องแล้ว Categories !!!!

ถ้ายังไม่เคยใช้ หรือไม่รู้จักว่ามันคืออะไร ลองอ่าน http://www.macfeteria.com/2008/11/objective-c-programmming-extending-class/

Stack

stack เป็น container ชนิดหนึ่งที่มีลักษณะการทำงานคือ อะไรที่เข้าไปก่อน จะออกทีหลัง ก็เหมือนเอาหนังสือวางลงไปในกล่องทับกัน นั่นเหละครับ ถ้าอยากได้เล่มล่างสุดก็ต้องเอาเล่มบนสุดออกก่อน เอาละครับเรามาดู code กันเลยดีกว่าว่าเราเขียนมันได้ยังไง

// ------- Interface -------------------------
@interface NSMutableArray (QueueAdditions)
- (id) dequeue;
- (void) enqueue:(id)obj;
@end
 
 
 
 
// ------- Implement -------------------------
@implementation NSMutableArray (QueueAdditions)
// Queues are first-in-first-out, so we remove objects from the head
- (id) dequeue {
    // if ([self count] == 0) return nil; // to avoid raising exception (Quinn)
    id headObject = [self objectAtIndex:0];
    if (headObject != nil) {
        [[headObject retain] autorelease]; // so it isn't dealloc'ed on remove
        [self removeObjectAtIndex:0];
    }
    return headObject;
}
 
// Add to the tail of the queue (no one likes it when people cut in line!)
- (void) enqueue:(id)anObject {
    [self addObject:anObject];
    //this method automatically adds to the end of the array
}
@end

Queue

queue ก็ไม่ต้องอธิบายอะไรมากครับ คือเรียงตามลำดับก่อนหลัง

// ------- Interface -------------------------
@interface NSMutableArray (StackAdditions)
- (id)pop;
- (void)push:(id)obj;
@end
 
// ------- Implement -------------------------
@implementation NSMutableArray (StackAdditions)
- (id)pop
{
    // nil if [self count] == 0
    id lastObject = [[[self lastObject] retain] autorelease];
    if (lastObject)
        [self removeLastObject];
    return lastObject;
}
 
- (void)push:(id)obj
{
     [self addObject: obj];
}
 
@end

จะเห็นได้ว่า เราสามารถใช้ categories เข้ามาช่วยเพิ่มความสามารถของ NSMutableArray ได้ง่ายๆมาก และเราก็ไม่ต้องไปเขียน stack หรือ queue เอง


4 responses so far, want to say something?

  1. Avatar

    besttermc says:

    ขอนอกเรื่องนิสนึงนะครับ

    ถ้าอยากเขียน socket programming
    แต่มีmacเครื่องเดียว จะทดสอบยังไงดีครับ

    แล้ว ใช้ CFNetwork เขียนเอาหรอครับ
    พอมีข้อแนะนำไหมคับ

  2. Avatar

    admin says:

    iPhone หรือว่า Mac App อะครับ
    คือถ้าเป็น Mac App เนี่ยเราจะใช้ CFNetwork ก็ได้ครับถ้าหากว่าเขียนโปรแกรมด้วย Carbon
    แต่ถ้าใช้ภาษา objective-c อยู่แล้ว cocoa มี framework พวก network ให้ใช้ครับ

    เครื่องเดียวจริงๆก็ทำได้นะครับ เราเขียน server , client บนเครื่องเดียวก็ได้
    แต่ว่าถ้าจะให้ดีต้องมีสองเครื่องครับ

  3. Avatar

    besttermc says:

    iPhone ครับ

    อยากเขียน ให้ส่ง_รับกันให้ได้ก่อนครับ

    เพราะตอนนี้ ยังเปิด connection ยังไม่ได้เลยครับ
    ยัง set port กับ ip ยังไม่รุ้ว่าไปเซ็ตตรงไหนเลยครับ

  4. Avatar

    besttermc says:

    ตัวอย่างที่ส่งมาให้ มี echo server ที่ให้ระบุ port ใช่ป่ะครับ
    แล้วอีกตัวเอาไว้ใช้ทำอะไรอ่าครับ ที่ให้ print certificate อะไรซักอย่าง

Leave a Reply

You must be logged in to post a comment.