日期:2014-05-18  浏览次数:20900 次

小女子又来提问有关数据结构的基础问题,求教(有关前,中,后缀表达式)
小女子正在自学《数据结构与算法C#语言描述》的第五章,栈和队列。
看到栈的操作这节,不太明白,求教各位大侠,最好能有适当的代码举例。
书中用中缀表达式写的,代码如下:
namespace _5._2._2
{
  class Program
  {
  static void Main(string[] args)
  {
  Stack nums = new Stack();
  Stack ops = new Stack();
  string expression = "5+10+15+20";
  Calculate(nums,ops,expression);
  Console.WriteLine(nums.Pop());
  Console.Read();

  }
  static bool Isnumeric(string input)
  {
  bool flag = true;
  string pattern=(@"^\d+$");
  Regex validate = new Regex(pattern);
  if (!validate.IsMatch(input))
  {
  flag = false;
  }
  return flag;
  }
  static void Calculate(Stack N, Stack O, string exp)
  {
  string ch, token = "";
  for (int p = 0; p < exp.Length; p++)
  {
  ch = exp.Substring(p,1);
  if (Isnumeric(ch))
  token += ch;//+=
  if (ch == " " || p == (exp.Length - 1))
  {
  if (Isnumeric(token))
  {
  N.Push(token);
  token = "";
  }
  }
  else if (ch == "+" || ch == "-" || ch == "*" || ch == "/")
  O.Push(ch);
  if (N.Count == 2)
  Compute(N, O);
  }
  }

  static void Compute(Stack N, Stack O)
  {
  int oper1, oper2;
  string oper;
  oper1 = Convert.ToInt32(N.Pop());
  oper2 = Convert.ToInt32(N.Pop());
  oper = Convert.ToString(O.Pop());
  switch (oper)
  {
  case "+":
  N.Push(oper1+oper2);
  break;
  case "-":
  N.Push(oper1-oper2);
  break;
  case "*":
  N.Push(oper1*oper2);
  break;
  case "/":
  N.Push(oper1/oper2);
  break;
  }
  }
请问,如果是用前缀表达式或者是后缀表达式的代码是如何编写的呢?
还有,这3种表达式之间的互相转换又是如何操作的呢?

PS:本人初学,还没看到浮点和二叉树等等这些内容,希望各位能由浅入深的表达以帮助我理解。谢谢各位

------解决方案--------------------
“前、中、后”啊,这不是很普通很习惯嘛。

有想象力就很容易理解。你的代码非常简单直白,其实用不着什么解释。比如对于表达式
3 5 + 7 -
那么就是当分别把每一个token压入堆栈之时,当看到+号时,就把栈中两个数值弹出栈(你的程序把+号也压入栈,其实有一点多余的),计算出3+5的结果为8,再压入栈;然后当看到-号时,就把栈中两个数值弹出栈,计算出8-1的结果为1,再压入栈。当所有token一趟扫描完,栈中就剩下了计算结果(这里为1)。
------解决方案--------------------
探讨
而假设表达式写
3 + 5 - 7
则也是一样,当看到5的时候,把栈中的数字3跟符号+弹出栈,计算结果8压入栈;当看到7的时候将栈中的数字8跟符号-弹出栈,计算结果1压入栈......如此这样计算。



对于表达式
- + 4 5 7
也是一样,当看到数字5时就把之前的符号+跟数字4弹出栈,计算结果8压入栈;当看到7的时候就把栈中的符号-跟数字8弹出栈,计算结果1压入栈.……