Parsing a postfix expression in C#, my naive approach





5.00/5 (1 vote)
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));
}
}