表达式计算的演示程序.
下面的表达式计算只支持个位数计数, 用来说明计算原理.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace calc1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.textBox2.Text = ComputeExpression(this.textBox1.Text).ToString();
bool x0 = true, x1 = false, x2 = false, m0 = true;
//if ((x0 || x1 || x2) && m0)
// this.textBox2.Text = "ok";
//if (x0 || x1 || x2 && m0)
// this.textBox2.Text = "ok";
}
/// <summary>
/// 返回两运算符的优先级
/// </summary>
/// <param name="first"></param>
/// <param name="last"></param>
/// <returns>">, < , ="</returns>
private char Precede(char first, char last)
{
string operate = "+-*/()#";
char[,] level = new char[7, 7]{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','<','<','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','='},
{'<','<','<','<','<',' ','='}
};
int rows = operate.IndexOf(first);
int cols = operate.IndexOf(last);
return level[rows, cols];
}
//主要是来展示表中的内容,返回>,<,=.
//算术表达式的计算算法,参数假设为标准的中缀表达式,否则会出现异常
/// <summary>
/// 算符优先算法
/// </summary>
/// <param name="infixExpression">中缀表达式</param>
/// <returns></returns>
public int ComputeExpression(string infixExpression)
{
Stack<int> stackOperand = new Stack<int>(); //操作数栈
Stack<char> stackOperator = new Stack<char>(); //操作符栈
stackOperator.Push('#'); //作为栈空的结束符
infixExpression = infixExpression + "#"; //中缀表达式的结束符
int temp = 0;
int result = 0;
int count = 0;
char cur = infixExpression[count];
while (cur != '#' || stackOperator.Peek() != '#') //扫描完算术表达式,并且操作符栈为空
{
if (cur == ' ') continue;
if (IsOperand(cur)) //操作数直接入栈
{
stackOperand.Push(Int32.Parse(cur.ToString()));
cur = infixExpression[++count]; //扫描算术表达式下一位
}
else
{
switch (Precede(stackOperator.Peek(), cur)) //比较操作符栈顶元素和扫描的当前算符的优先级
{
//当前运算符优先级较大,则直接入栈,置于栈顶(优先级高需先计算)
case '<':
stackOperator.Push(cur);
cur = infixExpression[++count];
break;
//等于则表示栈顶元素为左括号,当前字符为右括号
case '=':
stackOperator.Pop();//弹出左括号
cur = infixExpression[++count];
break;
//当前运算符优先级小,则弹出栈顶运算符并从操作数栈弹出两个操作数
case '>':
temp = stackOperand.Pop();
result = stackOperand.Pop();
//注意计算的顺序,计算结果入操作数栈,并且继续比较新的栈顶操作符和当前操作符的优先级
stackOperand.Push(Operate(result, temp, stackOperator.Pop()));
break;
}
}
}
return stackOperand.Peek();
}
bool IsOperand(char c)
{
int res;
if (int.TryParse(c.ToString(), out res)) return true;
return false;
}
int Operate(int a, int b, char c)
{
int res = 0;
switch (c)
{
case '+':
res = a + b;
break;
case '-':
res = a - b;
break;
case '*':
res = a * b;
break;
case '/':
res = a / b;
break;
}
return res;
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:



少有人走的路


















