using System.Collections;
public class OperationInvalidException: Exception
protected Stack stack = new Stack();
protected String[] allowedOperations = { "dup", "pop", "+", "-" };
protected String commandLine = "";
public WordMachine(String commandLine)
this.commandLine = commandLine;
public bool IsOperationAllowed(String operation)
String normalizedOperation = operation.ToLower();
bool isNumeric = int.TryParse(normalizedOperation, out n);
if(isNumeric) return true;
else if(allowedOperations.Contains(normalizedOperation)) return true;
protected void ProcessOperation(String operation)
String normalizedOperation = operation.ToLower();
if(!IsOperationAllowed(normalizedOperation)) throw new OperationInvalidException();
bool isNumeric = int.TryParse(normalizedOperation, out n);
stack.Push(normalizedOperation);
Console.WriteLine("push " + normalizedOperation);
switch (normalizedOperation) {
if(stack.Count == 0) throw new OperationInvalidException();
peek = (String)stack.Peek();
Console.WriteLine("dup " + peek);
if(stack.Count == 0) throw new OperationInvalidException();
peek = (String)stack.Peek();
Console.WriteLine("pop " + peek);
if(stack.Count < 2) throw new OperationInvalidException();
int sum = Int32.Parse((String)stack.Pop()) + Int32.Parse((String)stack.Pop());
stack.Push(sum.ToString());
if(stack.Count < 2) throw new OperationInvalidException();
int difference = Int32.Parse((String)stack.Pop()) - Int32.Parse((String)stack.Pop());
if(difference < 0) throw new OperationInvalidException();
else stack.Push(difference.ToString());
default: throw new OperationInvalidException();
Console.WriteLine("-----------------------------------------------");
private void printStack()
foreach(String s in stack)
Console.WriteLine("Item: " + s);
String[] operations = commandLine.Split(' ');
foreach(var operation in operations)
ProcessOperation(operation);
catch(OperationInvalidException)
Console.WriteLine("Operation not allowed: " + operation);
if(stack.Count == 0) return -1;
else return Int32.Parse((String)stack.Peek());
public int solution(String s)
WordMachine wordMachine = new WordMachine(s);
return wordMachine.execute();
public static void Main()
String instruction = "5 6 + -";
Solution solution = new Solution();
Console.WriteLine("Solution 1 = " + solution.solution(instruction));