2012-02-03 3 views
1

一部は、私は次の方法を使用することのために、ディスプレイ上で解決すべき存在である現在の方程式をプリントアウトしていますiOSの - スタンフォードCS193P 2011もちろん秋、割り当て2 descriptionOfProgram問題この割り当ての

+ (NSString *)descriptionOfTopOfStack:(NSMutableArray *)stack { 
    NSMutableString *programFragment = [NSMutableString stringWithString:@""]; 

    id topOfStack = [stack lastObject]; 
    if (topOfStack) [stack removeLastObject]; 

    if ([topOfStack isKindOfClass:[NSNumber class]]) { 
     [programFragment appendFormat:@"%g", [topOfStack doubleValue]]; 
    } else if ([topOfStack isKindOfClass:[NSString class]]) { 
     NSString *operation = topOfStack; 
     if ([self isDoubleOperandOperation:operation]) { 
      [programFragment appendFormat:@"(%@ %@ %@)", [self descriptionOfTopOfStack:stack], operation, [self descriptionOfTopOfStack:stack]]; 
     } else if ([self isSingleOperandOperation:operation]) { 
      [programFragment appendFormat:@"%@(%@)", operation, [self descriptionOfTopOfStack:stack]]; 
     } else if ([ self isNoOperandOperation:operation]) { 
      [programFragment appendFormat:@"%@", operation]; 
     } else if ([self isVariable:operation]) { 
      [programFragment appendFormat:@"%@", operation]; 
     } 
    } 

    return programFragment; 
} 

+ (NSString *)descriptionOfProgram:(id)program { 
    NSMutableArray *stack; 
    if ([program isKindOfClass:[NSArray class]]) { 
     stack = [program mutableCopy]; 
    } 

    return [self descriptionOfTopOfStack:stack]; 
} 

を私のプログラムは結果とすべてをうまく計算しますが、唯一の問題は、変数、数字、または単一オペランドの操作を入力すると、その最後の項目が表示されることです。配列は、他の再帰呼び出しが行われないので、どのようにしてスタック全体を通してプログラムを実行させ、出力を中断させることができないか考えていますか?

答えて

2

あなたは何を意味するのかよく分かりません。再帰は、可変、桁、または単一オペランド操作で停止する必要があります。 sin(オペランド)操作では、オペランドを続ける必要があります。

スタックが完全に定義されていない可能性がありますか?

は、あなたが入力したと言う:3これはに変換すべき5 + 6 7 * 9 SQRTを入力し

を入力します、+ 5 3 6、SQRT(7 * 9)

だからあなたはまだ上に3つの要素を持っていますあなたのスタックはsqrt(7 * 9)で停止しました。

スタックに何かが残っているかどうかを確認するには、チェックを追加し、必要に応じてコンマを追加する必要があります。

+0

はい、それは事私の問題だが、私は継続する方法がわからないですが、私は私の出力 – 8vius

+0

Aleeneを私のめちゃくちゃにせずに値を連結継続する方法を意味し、これは私が必要なものを私に与える必要があり、あなたの入力をありがとうございました、助言の言葉:もしあなたがすでに1つを作っているなら、もっと答えを出さないでください。あなたの答えを広げるためにコメントをつけてください。私はちょうど1つを受け入れることができるので、私は冷静になり、それらをすべてアップします。再度、感謝します。 – 8vius

1

OK、その後、別のヒント(最後に追加される):

if ([stack count]) { // did I finish the entire stack? 
    [programFragment appendFormat:@"%@, %@", [self describeStack:stack], programFragment]; 
} 
+0

descriptionOfTopOfStackメソッドの最後にこれを追加しますか? – 8vius

1

興味深いことにあなたはNSMutableStringを使用している、私はNSStringのでそれをやったし、クラスメソッドstringWithFormatを使用しました。だから私の結果は新しい文字列です。どちらのアプローチが良いか分かりません。

0

aleeneはすでに答えていますが、明らかにするだけです。再帰関数を呼び出すメソッドで[スタック数]チェックを追加しました。

+ (NSString *)descriptionOfProgram:(id)program { 
     NSMutableArray *stack; 
     NSString *strDesc = @""; 

     if ([program isKindOfClass:[NSArray class]]) { 
      // Make a consumable, mutable copy: 
      stack = [program mutableCopy]; 
     } 

     while (stack.count) { 
      strDesc = [strDesc stringByAppendingString:[self descriptionOfTopOfStack:stack]]; 
      if (stack.count) { 
       // More statements still on stack. We will loop again, but first, append comma separator: 
       strDesc = [strDesc stringByAppendingString:@", "]; 
      } 
     } 

     return strDesc; 
    }