65.9K
CodeProject is changing. Read more.
Home

Parsing a postfix expression in C#, my naive approach

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1 vote)

Dec 21, 2010

CPOL
viewsIcon

8167

For those who like dense code, here is a sample :) - Make the dictionary static readonly, init directly- Swap the arguments in the lambda expressions and call by direct pop from the stack- Make the regex simpler and put the logic of parsing into the Exec (the regex only tokenizes the...

For those who like dense code, here is a sample :) - Make the dictionary static readonly, init directly - Swap the arguments in the lambda expressions and call by direct pop from the stack - Make the regex simpler and put the logic of parsing into the Exec (the regex only tokenizes the string) - Use Linq extensions for iterating over the matches (debatable, though) This code is not really good code - but it shows some alternate techniques. Have fun! Andi
class RPNCalc
{
    private static readonly Dictionary<string, Func<int, int, int>> oper = new Dictionary<string, Func<int, int, int>>()
    {
        { "+", (b,a) => a + b }, { "-", (b,a) => a - b }, { "*", (b,a) => a * b }, { "/", (b,a) => a / b }
    };
    private Stack<int> stack = new Stack<int>();
    private string Exec
    { set { stack.Push(oper.ContainsKey(value) ? oper[value](stack.Pop(), stack.Pop()) : int.Parse(value)); } }
    public int Calc(string s)
    { new Regex(@"\s*(\d+|[-+*/])\s*").Matches(s).Cast<Match>().ToList().ForEach(m=>Exec=m.Value); return stack.Peek(); }
}

class Program
{
    static void Main(string[] args)
    {
        string expr = "23 5-12*";
        RPNCalc objCalc = new RPNCalc();
        Console.WriteLine("Expr: {0} = {1}", expr, objCalc.Calc(expr));
    }
}