在编程应用程序过程中,有时需要字符串表达式的值。如字符串:"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;
}
}
}
本文地址:http://com.8s8s.com/it/it42078.htm