小女子又来提问有关数据结构的基础问题,求教(有关前,中,后缀表达式)
小女子正在自学《数据结构与算法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)。
------解决方案--------------------