读书人

小女子又来提问有关数据结构的基础有关

发布时间: 2012-05-23 13:44:13 作者: rapoo

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

读书人网 >C#

热点推荐