字符串表达式求值 C#实现
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace ExpressionResult1
{
??? public partial class Form1 : Form
??? {
??????? public Form1()
??????? {
??????????? InitializeComponent();
??????? }
??????? //建立一個(gè)數(shù)棧和一個(gè)操作符棧
??????? Stack<int> numberStack = new Stack<int>();
??????? Stack<char> operatorStack = new Stack<char>();
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? //在表達(dá)式前后加開(kāi)始和結(jié)束標(biāo)識(shí)符
??????????? string expressin = "#" + textBox1.Text + "#";
??????????? bool label = false;//標(biāo)識(shí)是否出現(xiàn)連續(xù)的數(shù)字字符
??????????? foreach (char ch in expressin)
??????????? {
??????????????? if (ch >= '0' && ch <= '9')//數(shù)字入棧
??????????????? {
??????????????????? if (label == true)
??????????????????? {
??????????????????????? int temp = numberStack.Pop();
??????????????????????? temp = temp * 10 + int.Parse(ch.ToString());
??????????????????????? numberStack.Push(temp);
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? numberStack.Push(int.Parse(ch.ToString()));
??????????????????????? label = true;
??????????????????? }
??????????????? }
??????????????? else
??????????????? {
??????????????????? if (operatorStack.Count == 0)//將開(kāi)始標(biāo)識(shí)符入棧
??????????????????? {
??????????????????????? operatorStack.Push(ch);
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? label = false;
??????????????????????? string priority = GetPriority(ch);
??????????????????????? while(priority == "outOperator")//操作符出棧,并計(jì)算前后兩個(gè)數(shù)
??????????????????????? {
??????????????????????????? int num1 = numberStack.Pop();
??????????????????????????? int num2 = numberStack.Pop();
??????????????????????????? char oper = operatorStack.Pop();
??????????????????????????? int result = GetResult(num1 ,num2 ,oper);
??????????????????????????? numberStack.Push(result );
??????????????????????????? priority = GetPriority(ch);
??????????????????????? }
??????????????????????? if (priority == "inOperator")//操作符進(jìn)棧
??????????????????????? {
??????????????????????????? operatorStack.Push(ch);
??????????????????????? }
??????????????????????? else //操作符直接彈出
??????????????????????? {
??????????????????????????? operatorStack.Pop();
??????????????????????? }
??????????????????? }
??????????????? }
??????????? }
??????????? textBox2.Text = numberStack.Pop().ToString();
??????? }
??????? private string GetPriority(char outChar)//比較棧外和棧內(nèi)兩個(gè)操作符的優(yōu)先級(jí)
??????? {
??????????? char inChar = operatorStack.Peek();
??????????? switch (outChar)
??????????? {
??????????????? case '+':
??????????????? case '-':
??????????????????? switch (inChar)
??????????????????? {
??????????????????????? case '+':
??????????????????????? case '-':??????????????????????????
??????????????????????? case '*':
??????????????????????? case '/':????????????????????
????????????????????????? return "outOperator";??
??????????????????????? case '(':
??????????????????????? case '#':
????????????????????????? return "inOperator";
??????????????????? }
??????????????????? break;
??????????????? case '*':
??????????????? case '/':
??????????????????? switch (inChar)
??????????????????? {
??????????????????????? case '+':
??????????????????????? case '-':
??????????????????????? case '(':
??????????????????????? case '#':
??????????????????????????? return "inOperator";
??????????????????????? case '*':
??????????????????????? case '/':
??????????????????????????? return "outOperator";
??????????????????? }
??????????????????? break;
??????????????? case '(':
??????????????????? return "inOperator";
??????????????? case ')':
??????????????????? switch (inChar)
??????????????????? {
??????????????????????? case '(':
??????????????????????????? return "abandonOperator";
??????????????????????? default :
??????????????????????????? return "outOperator";
??????????????????? }???????????????????
??????????????? case '#':
??????????????????? switch (inChar)
??????????????????? {
??????????????????????? case '#':
??????????????????????????? return "abandonOperator";
??????????????????????? default :
??????????????????????????? return "outOperator";
??????????????????? }
??????????????? default :
??????????????????? throw new Exception("包含非法字符!");
??????????? }
??????????? return "";
??????? }
??????? private int GetResult(int num1, int num2, char oper)//根據(jù)操作符計(jì)算兩個(gè)數(shù)
??????? {
??????????? int result = 0;
??????????? switch (oper)
??????????? {
??????????????? case '+':
??????????????????? result = num2 + num1;
??????????????????? break;
??????????????? case '-':
??????????????????? result = num2 - num1;
??????????????????? break;
??????????????? case '*':
??????????????????? result = num2 * num1;
??????????????????? break;
??????????????? case '/':
??????????????????? if (num1==0)
??????????????????? {
??????????????????????? throw new Exception();
??????????????????? }
??????????????????? result = num2 / num1;
??????????????????? break;
??????????????? default :
??????????????????? result = 0;
??????????????????? break;
??????????? }
??????????? return result;
??????? }
??? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/muscular_wolf/archive/2010/08/17/1801721.html
總結(jié)
以上是生活随笔為你收集整理的字符串表达式求值 C#实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 采集工具有哪些-免费的采集工具下载
- 下一篇: 深度学习修炼(五)——基于pytorch