字符串表达式计算C#程序设计

    技术2022-05-11  58

    字符串表达式计算C#程序设计

    在编程应用程序过程中,有时需要字符串表达式的值。如字符串:"23+56/(102-100)*((36-24)/(8-6))",结果=191。      根据数据结构栈的应用介绍,通过把表达式由中序式转换成后序式,再用栈来进行计算。如上述字符串表达式:"23+56/(102-100)*((36-24)/(8-6))",转换为后序时为:"23|56|102|100|-|/|*|36|24|-|8|6|-|/|*|+"(其中字符"|"为分隔符)。      本程序代码如下:在Visual .net 2003 +winXP下编译通过。using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;

    namespace stringExpressionCalculate{ /// <summary> /// Form1 的摘要说明。 /// </summary> public class Form1 : System.Windows.Forms.Form {

      private System.Windows.Forms.TextBox textBox1;  private System.Windows.Forms.Button button1;  private System.Windows.Forms.TextBox textBox2;  private System.Windows.Forms.Label label1;  private System.Windows.Forms.Label label2;   /// <summary>  /// 必需的设计器变量。  /// </summary>  private System.ComponentModel.Container components = null;

      public Form1()  {   //   // Windows 窗体设计器支持所必需的   //   InitializeComponent();

       //   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码   //  }

      /// <summary>  /// 清理所有正在使用的资源。  /// </summary>  protected override void Dispose( bool disposing )  {   if( disposing )   {    if (components != null)     {     components.Dispose();    }   }   base.Dispose( disposing );  }

      #region Windows 窗体设计器生成的代码  /// <summary>  /// 设计器支持所需的方法 - 不要使用代码编辑器修改  /// 此方法的内容。  /// </summary>  private void InitializeComponent()  {   this.textBox1 = new System.Windows.Forms.TextBox();   this.button1 = new System.Windows.Forms.Button();   this.textBox2 = new System.Windows.Forms.TextBox();   this.label1 = new System.Windows.Forms.Label();   this.label2 = new System.Windows.Forms.Label();   this.SuspendLayout();   //    // textBox1   //    this.textBox1.Location = new System.Drawing.Point(114, 33);   this.textBox1.Name = "textBox1";   this.textBox1.Size = new System.Drawing.Size(273, 21);   this.textBox1.TabIndex = 0;   this.textBox1.Text = "23+56/(102-100)*((36-24)/(8-6))";   //    // button1   //    this.button1.Location = new System.Drawing.Point(180, 144);   this.button1.Name = "button1";   this.button1.Size = new System.Drawing.Size(84, 27);   this.button1.TabIndex = 1;   this.button1.Text = "计算(&C)";   this.button1.Click += new System.EventHandler(this.button1_Click);   //    // textBox2   //    this.textBox2.Location = new System.Drawing.Point(114, 72);   this.textBox2.Name = "textBox2";   this.textBox2.Size = new System.Drawing.Size(273, 21);   this.textBox2.TabIndex = 2;   this.textBox2.Text = "";   //    // label1   //    this.label1.AutoSize = true;   this.label1.Location = new System.Drawing.Point(48, 36);   this.label1.Name = "label1";   this.label1.Size = new System.Drawing.Size(54, 17);   this.label1.TabIndex = 3;   this.label1.Text = "字符串:";   //    // label2   //    this.label2.AutoSize = true;   this.label2.Location = new System.Drawing.Point(39, 75);   this.label2.Name = "label2";   this.label2.Size = new System.Drawing.Size(66, 17);   this.label2.TabIndex = 3;   this.label2.Text = "计算结果:";   //    // Form1   //    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);   this.ClientSize = new System.Drawing.Size(442, 221);   this.Controls.Add(this.label1);   this.Controls.Add(this.textBox2);   this.Controls.Add(this.button1);   this.Controls.Add(this.textBox1);   this.Controls.Add(this.label2);   this.Name = "Form1";   this.Text = "Form1";   this.ResumeLayout(false);

      }  #endregion

      /// <summary>  /// 应用程序的主入口点。  /// </summary>  [STAThread]  static void Main()   {   Application.Run(new Form1());  }

      private void button1_Click(object sender, System.EventArgs e)  {

             textBox2.Text = CalculateParenthesesExpression(textBox1.Text.ToString());  }

        //中序转换成后序表达式再计算  // 如:23+56/(102-100)*((36-24)/(8-6))  // 转换成:23|56|102|100|-|/|*|36|24|-|8|6|-|/|*|+"  //以便利用栈的方式都进行计算。  private string  CalculateParenthesesExpression(string Expression)  {   ArrayList operatorList = new ArrayList();   string operator1;   string ExpressionString = "";   string operand3;   Expression = Expression.Replace(" ","");   while(Expression.Length > 0)   {    operand3 = "";    //取数字处理    if(Char.IsNumber(Expression[0]))    {     while(Char.IsNumber(Expression[0]))     {      operand3 += Expression[0].ToString() ;      Expression = Expression.Substring(1);      if(Expression == "")break;

         }     ExpressionString += operand3 + "|";    }

        //取“C”处理    if(Expression.Length >0 && Expression[0].ToString() == "(")    {     operatorList.Add("(");       Expression = Expression.Substring(1);     }

        //取“)”处理    operand3 = "";    if(Expression.Length >0 && Expression[0].ToString() == ")")    {     do     {            if(operatorList[operatorList.Count -1].ToString() != "(")      {       operand3 += operatorList[operatorList.Count -1].ToString() + "|" ;       operatorList.RemoveAt(operatorList.Count - 1) ;      }      else      {       operatorList.RemoveAt(operatorList.Count - 1) ;       break;      }           }while(true);     ExpressionString += operand3;     Expression = Expression.Substring(1);     }

        //取运算符号处理    operand3 = "";    if(Expression.Length >0 &&  (Expression[0].ToString() == "*" || Expression[0].ToString() == "/" || Expression[0].ToString() == "+" || Expression[0].ToString() == "-"))    {     operator1 = Expression[0].ToString();     if(operatorList.Count>0)     {             if(operatorList[operatorList.Count -1].ToString() == "(" || verifyOperatorPriority(operator1,operatorList[operatorList.Count - 1].ToString()))              {        operatorList.Add(operator1);        }       else         {        operand3 += operatorList[operatorList.Count - 1].ToString() + "|";         operatorList.RemoveAt(operatorList.Count - 1);        operatorList.Add(operator1);         ExpressionString += operand3 ;               }           }     else     {      operatorList.Add(operator1);      }     Expression = Expression.Substring(1);     }   }

       operand3 = "";   while(operatorList.Count != 0)   {    operand3 += operatorList[operatorList.Count -1].ToString () + "|";    operatorList.RemoveAt(operatorList.Count -1);    } 

       ExpressionString += operand3.Substring(0, operand3.Length -1);  ;   

       return CalculateParenthesesExpressionEx(ExpressionString);

      }

      // 第二步:把转换成后序表达的式子计算  //23|56|102|100|-|/|*|36|24|-|8|6|-|/|*|+"  private string  CalculateParenthesesExpressionEx(string Expression)  {   //定义两个栈   ArrayList operandList =new ArrayList();   float operand1;   float operand2;   string[] operand3;     Expression = Expression.Replace(" ","");   operand3 = Expression.Split(Convert.ToChar("|"));    for(int i = 0;i < operand3.Length;i++)   {    if(Char.IsNumber(operand3[i],0))    {     operandList.Add( operand3[i].ToString());    }    else    {      //两个操作数退栈和一个操作符退栈计算     operand2 =(float)Convert.ToDouble(operandList[operandList.Count-1]);     operandList.RemoveAt(operandList.Count-1);       operand1 =(float)Convert.ToDouble(operandList[operandList.Count-1]);     operandList.RemoveAt(operandList.Count-1);     operandList.Add(calculate(operand1,operand2,operand3[i]).ToString()) ;    }        }

       return operandList[0].ToString();   }

     

      //判断两个运算符优先级别  private bool verifyOperatorPriority(string Operator1,string Operator2)  {      if(Operator1=="*" && Operator2 =="+")     return true;   else if(Operator1=="*" && Operator2 =="-")     return true;   else if(Operator1=="/" && Operator2 =="+")     return true;   else if(Operator1=="/" && Operator2 =="-")     return true;   else    return false;  }

      //计算  private float calculate(float operand1, float operand2,string operator2)  {   switch(operator2)   {    case "*":     operand1 *=  operand2;     break;    case "/":     operand1 /=  operand2;     break;    case "+":     operand1 +=  operand2;     break;    case "-":     operand1 -=  operand2;     break;    default:     break;   }   return operand1;  }  }}


    最新回复(0)