栈实现字符串表达式计算_第1页
栈实现字符串表达式计算_第2页
栈实现字符串表达式计算_第3页
栈实现字符串表达式计算_第4页
栈实现字符串表达式计算_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、     最近频繁解决计算方面的问题,其中就有实现字符串表达式计算返回结果值需求,通过使用栈实现,需要定义运算符号优先级,其它就不细说,代码如下:csStack.cs:using System;namespace PYHB / <summary> / 栈堆设定。 / 日期:2005-05-17 / </summary> public class clsStack   private long Top;    /栈

2、最大序号  private int MaxSize; / MaxSize 栈的容量  private string Element;  public clsStack()     /   / TODO: 在此处添加构造函数逻辑   /   Top=-1;    / <summary>  / 设定栈大最大容量 

3、0;/ </summary>  / <param name="Size"></param>  public void Initialize(int Size)     MaxSize=Size;   Element=new stringSize;    / <summary>  / 入栈  / </summary>&#

4、160; / <param name="strItem"></param>  public void Push(string strItem)     if(!IsFull()       Top=Top+1;    ElementTop = strItem;         

5、; / <summary>  / 出栈  / </summary>  / <returns></returns>  public string Pop()     string strRtn=" "   if(!IsEmptly()       strRtn = ElementTop;

6、60;   Top=Top-1;      return strRtn;    public string  GetTop()     string strRtn=" "   if(!IsEmptly()       strRtn = ElementTop;  

7、0;   return strRtn;    public bool IsFull()     bool IsFull=Top=(MaxSize-1)?true:false;   return IsFull;    public void MakeEmptly()     Top = -1;    public boo

8、l IsEmptly()     bool IsEmptly=Top=-1?true:false;   return IsEmptly;   calculate.csusing System;using System.Text;using System.Windows.Forms;namespace PYHB / <summary> / 字符串表达式计算实现,返回计算结果字符数组  / 日期:2005-05-17 / <

9、;/summary> public class Calculate   private clsStack S=new clsStack();  public Calculate()     /   / TODO: 在此处添加构造函数逻辑   /        / <summary>  / 根据数字表达式字符串数

10、组,返回计算结果字符数组  / </summary>  / <param name="strSoure">strSour 中缀表达式字符串,头部没有“#”,尾部需要加上“#”</param>  / <returns>计算结果</returns>  public string Run(string strSoure)     if(strSoure=null)  

11、60;    return null;      string dRtn=new stringstrSoure.Length;   for(int k=0;k<strSoure.Length;k+)       string ATemp;    string strRPN;    strRPN=GetRPN(st

12、rSourek);    try         ATemp=strRPN.Trim().Split(' ');     for(int i=0;i<ATemp.Length;i+)           if(sysFun.IsNumber(ATempi)  

13、0;    S.Push(ATempi);      else       DoOperate(ATempi);             dRtnk=S.Pop();        catch  &#

14、160;   return dRtn;    / <summary>  /  Run 返回后缀表达式  /  strSour 中缀表达式字符串,头部没有“#”,尾部需要加上“#”  /  String  后缀表达式字符串,头尾都没有“#”  / </summary>  / <param name="strSource"></p

15、aram>  / <returns></returns>  private string GetRPN(string strSource)     string ATemp;   string strRPN="",Y;   ATemp=strSource.Trim().Split(' ');   S.Initialize(ATemp.Length);&

16、#160;  S.MakeEmptly();   S.Push("#");   try       for(int k=0;k<ATemp.Length;k+)         /数字     if(sysFun.IsNumber(ATempk)   &

17、#160;       strRPN += " "+ATempk;           /字符     else            if(ATempk=")")    

18、0;        do               Y=S.Pop();        if(Y!="(")         strRPN += " "+Y;

19、              while(Y.Trim()!="(");            else             do     

20、;          Y = S.Pop();        if (GetISP(Y) > GetICP(ATempk)          strRPN += " "+Y;           

21、;   while(GetISP(Y) > GetICP(ATempk);       S.Push(Y);       S.Push(ATempk);                   do   &#

22、160;     Y=S.Pop();     if(Y!="#")      strRPN+=" "+Y;        while(Y!="#");      catch   return strRPN;&

23、#160;   #region 运算符优先级定义  private enum isp     s35 = 0,   s40 = 1,   s94 = 7,   s42 = 5,   s47 = 5,   s37 = 5,   s43 = 3,   s45 = 3,  &

24、#160;s41 = 8    private enum icp     s35 = 0,   s40 = 8,   s94 = 6,   s42 = 4,   s47 = 4,   s37 = 4,   s43 = 2,   s45 = 2,   s41 = 1

25、60;   private int GetISP(string a1)     Encoding ascii =Encoding.ASCII;   byte a=ascii.GetBytes(a1);   switch(Convert.ToInt32(a0)       case 35:     return (int)isp.s35;&

26、#160;   case 40:     return (int)isp.s40;         case 94:     return (int)isp.s94;         case 42:     return (int)isp

27、.s42;         case 47:     return (int)isp.s47;         case 37:     return (int)isp.s37;         case 43: 

28、60;   return (int)isp.s43;         case 45:     return (int)isp.s45;         case 41:     return (int)isp.s41;    default:

29、60;    return (int)isp.s35;          private int GetICP(string a1)     Encoding ascii =Encoding.ASCII;   byte a=ascii.GetBytes(a1);   switch(Convert.ToInt32(a0)  

30、60;    case 35:     return (int)icp.s35;         case 40:     return (int)icp.s40;         case 94:     return (int

31、)isp.s94;         case 42:     return (int)icp.s42;         case 47:     return (int)icp.s47;         case 37: 

32、;    return (int)icp.s37;         case 43:     return (int)icp.s43;         case 45:     return (int)icp.s45;     &

33、#160;   case 41:     return (int)icp.s41;    default:     return (int)icp.s35;              #endregion  / <summary>  /

34、判断是否存在左右数字,并且复制  / </summary>  / <param name="dLeft">左数值</param>  / <param name="dRight">右的数值</param>  / <returns>是否成功</returns>  private bool GetTwoItem(ref decimal dLeft,ref decimal dRig

35、ht)     bool bRtn=true;   try       if(S.IsEmptly()     return false;    else     dRight = Convert.ToDecimal(S.Pop();    if(S.IsEmptly(

36、)     return false;    else     dLeft = Convert.ToDecimal(S.Pop();      catch         return bRtn;    / <summary>  / 根据运算符号计算,并且把计算结果以字符形式填充入栈  / </summary>  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论