日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

字符串表达式求值 C#实现

發(fā)布時間:2023/12/9 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串表达式求值 C#实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ExpressionResult1
{
??? public partial class Form1 : Form
??? {
??????? public Form1()
??????? {
??????????? InitializeComponent();
??????? }
??????? //建立一個數(shù)棧和一個操作符棧
??????? Stack<int> numberStack = new Stack<int>();
??????? Stack<char> operatorStack = new Stack<char>();

??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? //在表達式前后加開始和結(jié)束標識符
??????????? string expressin = "#" + textBox1.Text + "#";
??????????? bool label = false;//標識是否出現(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)//將開始標識符入棧
??????????????????? {
??????????????????????? operatorStack.Push(ch);
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? label = false;
??????????????????????? string priority = GetPriority(ch);
??????????????????????? while(priority == "outOperator")//操作符出棧,并計算前后兩個數(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")//操作符進棧
??????????????????????? {
??????????????????????????? operatorStack.Push(ch);
??????????????????????? }
??????????????????????? else //操作符直接彈出
??????????????????????? {
??????????????????????????? operatorStack.Pop();
??????????????????????? }
??????????????????? }
??????????????? }
??????????? }

??????????? textBox2.Text = numberStack.Pop().ToString();

??????? }

??????? private string GetPriority(char outChar)//比較棧外和棧內(nèi)兩個操作符的優(yōu)先級
??????? {
??????????? 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ù)操作符計算兩個數(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#实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。