Stack Triangle

Stack Triangle

$ dart 05_recursion/stack_triangle.dart
import 'dart:io';

class Params {
  int n;
  int returnAddress;

  Params(this.n, this.returnAddress){}
}

class StackX {
  int maxSize;
  List<Params> stackArray;
  int top;

  StackX(int s) {
    maxSize = s;
    stackArray = new List<Params>(maxSize);
    top = -1;
  }

  void push(Params p) {
    stackArray[++top] = p;
  }

  Params pop() {
    return stackArray[top--];
  }

  Params peek() {
    return stackArray[top];
  }
}

class StackTriangleApp {
  static int number;
  static int answer;
  static StackX stackX;
  static int codePart;
  static Params params;

  static void recTriangle() {
    stackX = new StackX(10000);
    codePart = 1;
    while (step() == false) {

    }
  }

  static bool step() {
    switch (codePart) {
      case 1:
        params = new Params(number, 6);
        stackX.push(params);
        codePart = 2;
        break;
      case 2:
        params = stackX.peek();
        if (params.n == 1) {
          answer = 1;
          codePart = 5;
        } else {
          codePart = 3;
        }
        break;
      case 3:
        params = new Params(params.n - 1, 4);
        stackX.push(params);
        codePart = 2;
        break;
      case 4:
        params = stackX.peek();
        answer = answer + params.n;
        codePart = 5;
        break;
      case 5:
        params = stackX.peek();
        codePart = params.returnAddress;
        stackX.pop();
        break; 
      case 6:
        return true;  
    }
    return false;
  }

}


void main() {
  stdout.write('Enter a number: ');
  StackTriangleApp.number = int.parse(stdin.readLineSync());
  StackTriangleApp.recTriangle();
  stdout.writeln('Triangle = ${StackTriangleApp.answer}');
}