动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C程序开发经典实例之1.
.新手入门:关于C++中的内联函数(.
.DOS下的3D按钮.
.TCPIP完整的一套基础介绍.
.C++对象布局及多态实现探索之虚函.
.C/C++ 编译器和调试器以及静态库.
.数据结构算法集---C++语言实现.
.通过预编译头文件来提高CB的编译.
.C程序开发经典实例之6.
.C #中的几个线程同步对象方法.
.C++数据类型的属性与限制.
.行==列==对角线 ◎ 魔幻矩阵.
.堆栈应用-后缀式四则计算器.
.C/C++编程新手错误语录.
.对于SSH crc32 compensation att.
.高质量C++/C编程指南 --&nb.
.用PcommPro开发串行通信程序.
.进制的转换.
.编辑器的改进.
.精华:C++编程新手错误语录(续一).

C++数据结构学习:用栈做表达式求值

发表日期:2008-3-8 |


  栈的应用很广泛,原书只讲解了表达式求值,那我也就只写这些。其实,栈的最大的用途是解决回溯问题,这也包含了消解递归;而当你用栈解决回溯问题成了习惯的时候,你就很少想到用递归了,比如迷宫求解。
另外,人的习惯也是先入为主的,比如树的遍历,从学的那天开始,就是递归算法,虽然书上也教了用栈实现的方法,但应用的时候,你首先想到的还是递归;当然了,假如语言本身不支持递归(如BASIC),那栈就是唯一的选择了——似乎现在的高级语言都是支持递归的。

  如下是表达式类的定义和实现,表达式可以是中缀表示也可以是后缀表示,用头节点数据域里的type区分,这里有一点说明的是,由于单链表的赋值函数,我原来写的时候没有复制头节点的内容,所以,要是在两个表达式之间赋值,头节点里存的信息就丢了。你可以改写单链表的赋值函数来解决这个隐患,或者你根本不不在两个表达式之间赋值也行。

  #ifndef EXPression_H

  #define Expression_H

  #include "List.h"

  #include "Stack.h"

  #define INFIX 0

  #define POSTFIX 1

  #define OPND 4

  #define OPTR 8

  template class ExpNode

  {

  public:

  int type;

  union { Type opnd; char optr;};

  ExpNode() : type(INFIX), optr('=') {}

  ExpNode(Type opnd) : type(OPND), opnd(opnd) {}

  ExpNode(char optr) : type(OPTR), optr(optr) {}

  };
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或
  template class Expression : List >

  {

  public:

  void Input()

  {

  MakeEmpty(); Get()->type =INFIX;

  cout << endl << "输入表达式,以=结束输入" << endl;

  Type opnd; char optr = ' ';

  while (optr != '=')

  {

  cin >> opnd;

  if (opnd != 0)

  {

  ExpNode newopnd(opnd);

  LastInsert(newopnd);

  }

  cin >> optr;

  ExpNode newoptr(optr);

  LastInsert(newoptr);
  }

  }
  void Print()

  {

  First();

  cout << endl;

  for (ExpNode *p = Next(); p != NULL; p = Next() )

  {

  switch (p->type)

  {
  
  case OPND:

  cout << p->opnd; break;

  case OPTR:

  cout << p->optr; break;

  default: break;

  }
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或   cout << ' ';

  }

  cout << endl;

  }
  Expression & Postfix() //将中缀表达式转变为后缀表达式

  {
  
  First();

  if (Get()->type == POSTFIX) return *this;


  Stack s; s.Push('=');

  Expression temp;

  ExpNode *p = Next();

  while (p != NULL)

  {

  switch (p->type)

  {

  case OPND:

  temp.LastInsert(*p); p = Next(); break;

  case OPTR:

  while (isp(s.GetTop()) > icp(p->optr) )

  {

  ExpNode newoptr(s.Pop());

  temp.LastInsert(newoptr);

  }

  if (isp(s.GetTop()) == icp(p->optr) )

  {

  s.Pop(); p =Next(); break;

  }

  s.Push(p->optr); p = Next(); break;

  default: break;

  }
  
  }

  *this = temp;

  pGetFirst()->data.type = POSTFIX;

  return *this;

  }
  Type Calculate()

  {
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或   Expression temp = *this;

  if (pGetFirst()->data.type != POSTFIX) temp.Postfix();

  Stack s; Type left, right;

  for (ExpNode *p = temp.Next(); p != NULL; p = temp.Next())

  {

  switch (p->type)

  {

  case OPND:

  s.Push(p->opnd); break;

  case OPTR:

  right = s.Pop(); left = s.Pop();

  switch (p->optr)

  {

  case '+': s.Push(left + right); break;

  case '-': s.Push(left - right); break;

  case '*': s.Push(left * right); break;

  case '/': if (right != 0) s.Push(left/right); else return 0; break;

  // case '%': if (right != 0) s.Push(left%right); else return 0; break;

  // case '^': s.Push(Power(left, right)); break;

  default: break;

  }

  default: break;

  }

  }

  return s.Pop();

  }
  private:

  int isp(char optr)

  {

  switch (optr)

  {

  case '=': return 0;

  case '(': return 1;

  case '^': return 7;

  case '*': return 5;

  case '/': return 5;

  case '%': return 5;

  case '+': return 3;

  case '-': return 3;

  case ')': return 8;

  default: return 0;


  }

  }
  int icp(char optr)
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或   {

  switch (optr)

  {

  case '=': return 0;

  case '(': return 8;

  case '^': return 6;

  case '*': return 4;

  case '/': return 4;

  case '%': return 4;

  case '+': return 2;

  case '-': return 2;

  case ')': return 1;
  
  default: return 0;

  }

    }
      };
  #endif
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或   几点说明
  l 表达式用单链表储存,你可以看到这个链表中既有操作数又有操作符,假如你看过我的《如何在一个链表中链入不同类型的对象》,这里的方法也是对那篇文章的补充。
  
  l 输入表达式时,会将原来的内容清空,并且必须按照中缀表示输入。假如你细看一下中缀表达式,你就会发现,除了括号,表达式的结构是“操作数”、“操作符”、“操作数”、……“操作符(=)”,为了统一这个规律,同时也为了使输入函数简单一点,规定括号必须这样输入“0(”、“)0”;这样一来,“0”就不能作为操作数出现在表达式中了。因为我没有在输入函数中增加容错的语句,所以一旦输错了,那程序就“死”了。
  
  l 表达式求值的过程是,先变成后缀表示,然后用后缀表示求值。因为原书讲解的是这两个算法,并且用这两个算法就能完成中缀表达式的求值,所以我就没写中缀表达式的直接求值算法。具体算法说明参见原书,我就不废话了。
  
  l Calculate()注释掉的两行,“%”是因为只对整型表达式合法,“^”的Power()函数没有完成。
  
  l isp(),icp()的返回值,原书说的不细,我来多说两句。‘=’(表达式开始和结束标志)的栈内栈外优先级都是最低。‘(’栈外最高,栈内次最低。‘)’栈外次最低,不进栈。‘^’栈内次最高,栈外比栈内低。‘×÷%’栈内比‘^’栈外低,栈外比栈内低。‘+-’栈内比‘×’栈外低,栈外比栈内低。这样,综合起来,就有9个优先级,于是就得出了书上的那个表。(CSDN)
    
更多文章 更多内容请看C/C++技术专题  数据结构  数据结构教程专题,或
上一篇:C++数据结构学习:事件驱动模拟 人气:589
下一篇:C++数据结构学习:栈和队列 人气:876
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成