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