字符串表达式计算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
{
///

1<summary>   
2/// Form1 的摘要说明。   
3/// </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;

///

1<summary>   
2/// 必需的设计器变量。   
3/// </summary>

private System.ComponentModel.Container components = null;

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

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

///

1<summary>   
2/// 清理所有正在使用的资源。   
3/// </summary>

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
///

1<summary>   
2/// 设计器支持所需的方法 - 不要使用代码编辑器修改   
3/// 此方法的内容。   
4/// </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

///

1<summary>   
2/// 应用程序的主入口点。   
3/// </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;
}

}
}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus