网站首页站长博客下载中心域名交易站长论坛域名主机免费电邮免费域名中文排行排名查询站长书库书籍教程下载
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
学院首页 网络编程 网页设计 图形图象 数 据 库 服 务 器 网络媒体 网络安全 个人专栏 站长CLUB 业界新闻 信息公告
 当前位置:首页 >> 网络编程 >> NET专区 >> 正文
公告通知
返回上级列表
资料搜索
相关文章
用户自定义控件的应用
c#.net常用函数和方法集
在VB中使用水晶报表的一种简易编
C#调用父类的父类的方法
浏览.NET Framework 2.0 类型库中
为.Text Blog 添加 计数器
编程实现邮件地址有效性检测 
VB/VB.NET/C#导出到Excel的方法
c#高性能在WEB端产生验证图片
用System.Web.Caching.Cache保存
栈实现字符串表达式计算
[ 来源:CSDN | 作者:未知 | 时间:2006-4-15 6:34:06 | 浏览:人次 ]
收藏到新浪ViVi 收藏到365KEY 收藏到我摘  字号选择〖    〗/ 双击滚屏 单击停止  
 

最近频繁解决计算方面的问题,其中就有实现字符串表达式计算返回结果值需求,通过使用栈实现,需要定义运算符号优先级,其它就不细说,代码如下:

csStack.cs:

using System;

namespace PYHB
{
 /// <summary>
 /// 栈堆设定。

 /// 日期:2005-05-17
 /// </summary>
 public class clsStack
 {
  private long Top;    //栈最大序号
  private int MaxSize; // MaxSize 栈的容量
  private string[] Element;
  public clsStack()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
   Top=-1;
  }
  /// <summary>
  /// 设定栈大最大容量
  /// </summary>
  /// <param name="Size"></param>
  public void Initialize(int Size)
  {
   MaxSize=Size;
   Element=new string[Size];
  }
  /// <summary>
  /// 入栈
  /// </summary>
  /// <param name="strItem"></param>
  public void Push(string strItem)
  {
   if(!IsFull())
   {
    Top=Top+1;
    Element[Top] = strItem;
   }
   
  }
  /// <summary>
  /// 出栈
  /// </summary>
  /// <returns></returns>
  public string Pop()
  {
   string strRtn=" ";
   if(!IsEmptly())
   {
    strRtn = Element[Top];
    Top=Top-1;
   }
   return strRtn;
  }
  public string  GetTop()
  {
   string strRtn=" ";
   if(!IsEmptly())
   {
    strRtn = Element[Top];
   }
   return strRtn;
  }
  public bool IsFull()
  {
   bool IsFull=Top==(MaxSize-1)?true:false;
   return IsFull;
  }
  public void MakeEmptly()
  {
   Top = -1;
  }
  public bool IsEmptly()
  {
   bool IsEmptly=Top==-1?true:false;
   return IsEmptly;
  }

 }
}

calculate.cs

using System;
using System.Text;
using System.Windows.Forms;

namespace PYHB
{
 /// <summary>
 /// 字符串表达式计算实现,返回计算结果字符数组
 
 /// 日期:2005-05-17
 /// </summary>
 public class Calculate
 {
  private clsStack S=new clsStack();
  public Calculate()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  
  
  /// <summary>
  /// 根据数字表达式字符串数组,返回计算结果字符数组
  /// </summary>
  /// <param name="strSoure">strSour 中缀表达式字符串,头部没有“#”,尾部需要加上“#”</param>
  /// <returns>计算结果</returns>
  public string[] Run(string[] strSoure)
  {
   if(strSoure==null)
   {
    return null;
   }
   string[] dRtn=new string[strSoure.Length];
   for(int k=0;k<strSoure.Length;k++)
   {
    string[] ATemp;
    string strRPN;
    strRPN=GetRPN(strSoure[k]);
    try
    {
     ATemp=strRPN.Trim().Split(' ');
     for(int i=0;i<ATemp.Length;i++)
     {
      if(sysFun.IsNumber(ATemp[i]))
       S.Push(ATemp[i]);
      else
       DoOperate(ATemp[i]);
     }
   
     dRtn[k]=S.Pop();
    }
    catch{}
   }
   return dRtn;
  }
  /// <summary>
  ///  Run 返回后缀表达式
  ///  strSour 中缀表达式字符串,头部没有“#”,尾部需要加上“#”
  ///  String  后缀表达式字符串,头尾都没有“#”

  /// </summary>
  /// <param name="strSource"></param>
  /// <returns></returns>
  private string GetRPN(string strSource)
  {
   string[] ATemp;
   string strRPN="",Y;
   ATemp=strSource.Trim().Split(' ');
   S.Initialize(ATemp.Length);
   S.MakeEmptly();
   S.Push("#");
   try
   {
    for(int k=0;k<ATemp.Length;k++)
    {
     //数字
     if(sysFun.IsNumber(ATemp[k]))
     {
      strRPN += " "+ATemp[k];
     }
      //字符
     else
     {
      if(ATemp[k]==")")
      {
       do
       {
        Y=S.Pop();
        if(Y!="(")
         strRPN += " "+Y;
       }
       while(Y.Trim()!="(");
      }
      else
      {
       do
       {
        Y = S.Pop();
        if (GetISP(Y) > GetICP(ATemp[k]))
         strRPN += " "+Y;
       }
       while(GetISP(Y) > GetICP(ATemp[k]));
       S.Push(Y);
       S.Push(ATemp[k]);
      }
     }
    }
    do
    {
     Y=S.Pop();
     if(Y!="#")
      strRPN+=" "+Y;
    }
    while(Y!="#");
   }
   catch{}
   return strRPN;
  }

  #region 运算符优先级定义
  private enum isp
  {
   s35 = 0,
   s40 = 1,
   s94 = 7,
   s42 = 5,
   s47 = 5,
   s37 = 5,
   s43 = 3,
   s45 = 3,
   s41 = 8
  }
  private enum icp
  {
   s35 = 0,
   s40 = 8,
   s94 = 6,
   s42 = 4,
   s47 = 4,
   s37 = 4,
   s43 = 2,
   s45 = 2,
   s41 = 1
  }
  private int GetISP(string a1)
  {
   Encoding ascii =Encoding.ASCII;
   byte[] a=ascii.GetBytes(a1);
   switch(Convert.ToInt32(a[0]))
   {
    case 35:
     return (int)isp.s35;

    case 40:
     return (int)isp.s40;
     
    case 94:
     return (int)isp.s94;
     
    case 42:
     return (int)isp.s42;
     
    case 47:
     return (int)isp.s47;
     
    case 37:
     return (int)isp.s37;
     
    case 43:
     return (int)isp.s43;
     
    case 45:
     return (int)isp.s45;
     
    case 41:
     return (int)isp.s41;
    default:
     return (int)isp.s35;
   }
   
  }
  private int GetICP(string a1)
  {
   Encoding ascii =Encoding.ASCII;
   byte[] a=ascii.GetBytes(a1);
   switch(Convert.ToInt32(a[0]))
   {
    case 35:
     return (int)icp.s35;
     
    case 40:
     return (int)icp.s40;
     
    case 94:
     return (int)isp.s94;
     
    case 42:
     return (int)icp.s42;
     
    case 47:
     return (int)icp.s47;
     
    case 37:
     return (int)icp.s37;
     
    case 43:
     return (int)icp.s43;
     
    case 45:
     return (int)icp.s45;
     
    case 41:
     return (int)icp.s41;
    default:
     return (int)icp.s35;
    
   }
   
  }
  #endregion

  /// <summary>
  /// 判断是否存在左右数字,并且复制
  /// </summary>
  /// <param name="dLeft">左数值</param>
  /// <param name="dRight">右的数值</param>
  /// <returns>是否成功</returns>
  private bool GetTwoItem(ref decimal dLeft,ref decimal dRight)
  {
   bool bRtn=true;
   try
   {
    if(S.IsEmptly())
     return false;
    else
     dRight = Convert.ToDecimal(S.Pop());
    if(S.IsEmptly())
     return false;
    else
     dLeft = Convert.ToDecimal(S.Pop());
   }
   catch
   {
   }
   return bRtn;
  }
  /// <summary>
  /// 根据运算符号计算,并且把计算结果以字符形式填充入栈
  /// </summary>
  /// <param name="op"></param>
  private void DoOperate(string op)
  {
   decimal NumLeft=0,NumRight=0;
   bool r;
   r=GetTwoItem(ref NumLeft,ref NumRight);
   if(r)
   {
    switch(op.Trim())
    {
     case "+":
      S.Push((NumLeft+NumRight).ToString());
      break;
     case "-":
      S.Push((NumLeft-NumRight).ToString());
      break;
     case "*":
      S.Push((NumLeft*NumRight).ToString());
      break;
     case "/":
      if(NumRight==0)
       S.Push("0");
      else
       S.Push((NumLeft/NumRight).ToString());
      break;

    }
   }
  }

}

}


[发送给好友]  [打印本页]  [关闭窗口]  [返回顶部]   转载请注明来源:http://edu.chinaz.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
栏目编辑: 设计风 责任编辑: keke
原始作者: 未知 录入时间: 2006-4-15 6:34:06
信息来源: CSDN 投稿信箱: Edu#chinaz.com
设为首页 - 加入收藏 - 关于我们 - 广告服务 - 版权申明 - 友情链接 - 联系方式 - 总编信箱 - 会员投稿