本文可以说是对W3Eval表达式求值这篇文章的翻译简化版本,不详细说了直接上代码.
/**
*找出第一个闭括号
*/
public int pos_first_closed_parenthesis(ArrayList list)
{
for (int i = 0; i <list.Count; i++)
{
if (list[i].ToString().Equals(")"))
return i;
}
return -1;
}
/**
*找出第一个开括号
*/
public int pos_open_parenthesis(ArrayList list, int closed_parenthesis)
{
int i;
i = closed_parenthesis - 1;
while (i >= 0)
{
if (list[i].ToString().Equals("("))
return i;
i--;
}
return -1;
}
public string count(ArrayList list)
{
int start = -1, end = -1, length = 0;
double num;
string result = "";
try
{
while (list.Count > 1)
{
end = pos_first_closed_parenthesis(list);
if (end != -1)
{
start = pos_open_parenthesis(list, end);
list.RemoveAt(end);
if (start != -1)
list.RemoveAt(start);
else
start = 0;
}else
{
end = list.Count-1;
start = 0;
}
length = end - start - 1;
ResultText.Text+= end + "," + start + "," + length + ",";
for (int i = start; i < start + length; i++)
{
if ("^".Equals(list[i].ToString()))
{
num = Math.Pow(Convert.ToDouble(list[i - 1].ToString()), Convert.ToDouble(list[i + 1].ToString()));
list[i - 1] = num.ToString();
list.RemoveAt(i);
list.RemoveAt(i);
length = length - 2;
i--;
};
}
for (int i = start; i < start + length; i++)
{
if ("*".Equals(list[i].ToString()))
{
num = Convert.ToDouble(list[i - 1].ToString()) * Convert.ToDouble(list[i + 1].ToString());
list[i - 1] = num.ToString();
list.RemoveAt(i);
list.RemoveAt(i);
length = length - 2;
i--;
}else if ("/".Equals(list[i].ToString()))
{
num = Convert.ToDouble(list[i - 1].ToString()) / Convert.ToDouble(list[i + 1].ToString());
list[i - 1] = num.ToString();
list.RemoveAt(i);
list.RemoveAt(i);
length = length - 2;
i--;
};
}
for (int i = start; i < start + length; i++)
{
if ("+".Equals(list[i].ToString()))
{
num = Convert.ToDouble(list[i - 1].ToString()) + Convert.ToDouble(list[i + 1].ToString());
list[i - 1] = num.ToString();
list.RemoveAt(i);
list.RemoveAt(i);
length = length - 2;
i--;
}else if ("-".Equals(list[i].ToString()))
{
num = Convert.ToDouble(list[i - 1].ToString()) - Convert.ToDouble(list[i + 1].ToString());
list[i - 1] = num.ToString();
list.RemoveAt(i);
list.RemoveAt(i);
length = length - 2;
i--;
};
}
if (start>=1)
{
if ("sin".Equals(list[start - 1].ToString()))
{
list[start - 1] = Math.Sin(Convert.ToDouble(list[start].ToString())).ToString();
list.RemoveAt(start);
}
else if ("cos".Equals(list[start - 1].ToString()))
{
list[start - 1] = Math.Cos(Convert.ToDouble(list[start].ToString())).ToString();
list.RemoveAt(start);
}
else if ("tg".Equals(list[start - 1].ToString()))
{
list[start - 1] = Math.Tan(Convert.ToDouble(list[start].ToString())).ToString();
list.RemoveAt(start);
}
else if ("ln".Equals(list[start - 1].ToString()))
{
list[start - 1] = Math.Log(Convert.ToDouble(list[start].ToString())).ToString();
list.RemoveAt(start);
}
else if ("SQRT".Equals(list[start - 1].ToString()))
{
list[start - 1] = Math.Sqrt(Convert.ToDouble(list[start].ToString())).ToString();
list.RemoveAt(start);
}
}
}
result = list[0].ToString();
}
catch (Exception e)
{
result=e.ToString();
}
return result;
}