using System;
using System.Text;
using System.Collections;namespace ExpressionCalculation
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
public void Push(ref ArrayList stack,string character)
{
try
{
if(stack.Count == stack.Capacity)
stack.Capacity *= 2;
//int temp = (int)character;

stack.Insert(0,character);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
} public void Pop(ref ArrayList stack,ref string savePop)
{
try
{
savePop = stack[0].ToString();
stack.Remove(stack[0]);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
 
} public string GetTop(ArrayList stack)
{
try
{
return stack[0].ToString();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
return "";
}
} public string CmpPRI(string Operator,string curOptr)
{
switch(Operator)
{
case "+":
switch(curOptr)
{
case "+":return ">"; case "-":return ">";

case "*":return "<";

case "/":return "<";

case "(":return "<";

case ")":return ">";

case "#":return ">";

//default :return 'x'; 

}
break;
case "-":
switch(curOptr)
{
case "+":return ">";

case "-":return ">";

case "*":return "<";

case "/":return "<";

case "(":return "<";

case ")":return ">";

case "#":return ">";

}
break;
case "*":
switch(curOptr)
{
case "+":return ">";

case "-":return ">";

case "*":return ">";

case "/":return ">";

case "(":return "<";

case ")":return ">";

case "#":return ">";

}
break;
case "/":
switch(curOptr)
{
case "+":return ">";

case "-":return ">";

case "*":return ">";

case "/":return ">";

case "(":return "<";

case ")":return ">";

case "#":return ">";

}
break;
case "(":
switch(curOptr)
{
case "+":return "<";

case "-":return "<";

case "*":return "<";

case "/":return "<";

case "(":return "<";

case ")":return "=";

//case "#"://return "<";

}
break;
case ")":
switch(curOptr)
{
case "+":return ">";

case "-":return ">";

case "*":return ">";

case "/":return ">";

//case "("://return ">";

case ")":return ">";

case "#":return ">";

}
break;
case "#":
switch(curOptr)
{
case "+":return "<";

case "-":return "<";

case "*":return "<";

case "/":return "<";

case "(":return "<";

//case ")"://return "=";

case "#":return "=";

}
break;
//default:return "";
}
return "";
} public bool IsOptr(string curCharacter)
{
if(curCharacter == "+" || curCharacter == "-" || curCharacter == "*" || curCharacter == "/" || curCharacter == "(" || curCharacter == ")" || curCharacter == "#")
{
return true;
}
else 
return false;
} public int Cal(string a,string theta,string b)
{
int x = Int32.Parse(a);
int y = Int32.Parse(b);
switch(theta)
{
case "+":return x + y;
case "-":return x - y;
case "*":return x * y;
case "/":return x / y;
}
return 0;
} public int Result()
{
string curChar,save = "",theta = "",a = "",b = "";
ArrayList optr,oprd;
optr = new ArrayList(50);//InitStack(optr);操作符栈
this.Push(ref optr,"#");
oprd = new ArrayList(50);//InitStack(oprd);操作数栈
    curChar = Console.ReadLine();
while(curChar != "#" || this.GetTop(optr) != "#")
{
if(!this.IsOptr(curChar))//操作数则入栈
{
this.Push(ref optr,curChar);
curChar= Console.ReadLine();
}
else
switch(this.CmpPRI(this.GetTop(optr),curChar))
{
case "<":
this.Push(ref optr,curChar);
curChar = Console.ReadLine();
break;
case "=":
this.Pop(ref optr,ref save);
curChar = Console.ReadLine();
break;
case ">":
this.Pop(ref optr,ref theta);
    this.Pop(ref oprd,ref b);
this.Pop(ref oprd,ref a);
this.Push(ref oprd,this.Cal(a,theta,b).ToString());
break;
}
}
return Int32.Parse(this.GetTop(oprd));
} [STAThread]
static void Main(string[] args)
{
int result;
Class1 myClass = new Class1();
Console.WriteLine("输入简单数学表达式,并以'#'号结束");
result = myClass.Result();
Console.WriteLine("计算结果:{0}",result);
Console.Read();
}
}
}

解决方案 »

  1.   

    //现在我用Stack实现 遇到同样的问题 大家帮看看 这次简洁多了:)
    using System;
    using System.Text;
    using System.Collections;namespace ExpressionCalculation
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    public string CmpPRI(string Operator,string curOptr)
    {
    switch(Operator)
    {
    case "+":
    switch(curOptr)
    {
    case "+":return ">"; case "-":return ">";

    case "*":return "<";

    case "/":return "<";

    case "(":return "<";

    case ")":return ">";

    case "#":return ">";


    }
    break;
    case "-":
    switch(curOptr)
    {
    case "+":return ">";

    case "-":return ">";

    case "*":return "<";

    case "/":return "<";

    case "(":return "<";

    case ")":return ">";

    case "#":return ">";

    }
    break;
    case "*":
    switch(curOptr)
    {
    case "+":return ">";

    case "-":return ">";

    case "*":return ">";

    case "/":return ">";

    case "(":return "<";

    case ")":return ">";

    case "#":return ">";

    }
    break;
    case "/":
    switch(curOptr)
    {
    case "+":return ">";

    case "-":return ">";

    case "*":return ">";

    case "/":return ">";

    case "(":return "<";

    case ")":return ">";

    case "#":return ">";

    }
    break;
    case "(":
    switch(curOptr)
    {
    case "+":return "<";

    case "-":return "<";

    case "*":return "<";

    case "/":return "<";

    case "(":return "<";

    case ")":return "=";


    }
    break;
    case ")":
    switch(curOptr)
    {
    case "+":return ">";

    case "-":return ">";

    case "*":return ">";

    case "/":return ">";


    case ")":return ">";

    case "#":return ">";

    }
    break;
    case "#":
    switch(curOptr)
    {
    case "+":return "<";

    case "-":return "<";

    case "*":return "<";

    case "/":return "<";

    case "(":return "<";


    case "#":return "=";

    }
    break;
    }
    return "";
    } public bool IsOptr(string curCharacter)
    {
    if(curCharacter == "+" || curCharacter == "-" || curCharacter == "*" || curCharacter == "/" || curCharacter == "(" || curCharacter == ")" || curCharacter == "#")
    {
    return true;
    }
    else 
    return false;
    } public int Cal(string a,string theta,string b)
    {
    int x = Int32.Parse(a);
    int y = Int32.Parse(b);
    switch(theta)
    {
    case "+":return x + y;
    case "-":return x - y;
    case "*":return x * y;
    case "/":return x / y;
    }
    return 0;
    } public int Result()
    {
    string curChar,save = "",theta = "",a = "",b = "";
    Stack optr,oprd;
    optr = new Stack(50);//InitStack(optr);操作符栈
    optr.Push("#");
    oprd = new Stack(50);//InitStack(oprd);操作数栈
    curChar = Console.ReadLine();
    while(curChar != "#" || optr.Peek().ToString() != "#")
    {
    if(!this.IsOptr(curChar))//操作数则入栈
    {
    optr.Push(curChar);
    curChar= Console.ReadLine();
    }
    else 
    switch(this.CmpPRI(optr.Peek().ToString(),curChar))
    {
    case "<":
    optr.Push(curChar);
    curChar = Console.ReadLine();
    break;
    case "=":
    save = optr.Pop().ToString();
    curChar = Console.ReadLine();
    break;
    case ">": optr.Push(theta);
    b = oprd.Pop().ToString();
    a = oprd.Pop().ToString();
    oprd.Push(this.Cal(a,theta,b).ToString());
    break;
    }
    }
    return Int32.Parse(oprd.Peek().ToString());
    } [STAThread]
    static void Main(string[] args)
    {
    int result;
    Class1 myClass = new Class1();
    Console.WriteLine("输入简单数学表达式,并以'#'号结束");
    result = myClass.Result();
    Console.WriteLine("计算结果:{0}",result);
    Console.Read();
    }
    }
    }
      

  2.   

    噢 SORRY 原理上我觉得应该没问题吧
    但是在读取字符串的时候没有分解  我觉得问题是出在这里了
    但是实在不懂怎么改动 呀
      

  3.   

    curChar = Console.ReadLine(); 
    while(curChar != "#" || optr.Peek().ToString() != "#")   -_-
    {
    if(!this.IsOptr(curChar))//操作数则入栈
    {
    optr.Push(curChar);
    curChar= Console.ReadLine();
    }你的程序要人家像下面这样子输入 “1+2+3”的?
    1
    +
    2
    +
    3
      

  4.   

    hehe现在这个读取问题解决了 但是对括号的入栈和出栈处理似乎不太合理
    但我又找不出到底哪有问题在那里 哎