- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构中栈和队列的应用数据结构程序设计实验报告1
实 验 报 告
课程名称 数据结构程序设计
实验项目 数据结构中栈和队列的应用
系 别___ _计算机学院 _ ______
专 业___ 网络工程 ___
班级/学号_网工1202/2012011411___
学生姓名 _______王宇涵__________
实验日期 _2014年6月2日
成 绩 _______________________
指导教师 黄改娟 田英爱
实验题目:表达式的运算
程序功能分析
(1)程序整体功能流程分析如下。
第一步,用户输入表达式。
第二步,对用户输入的表达式进行过滤,如果有错,请用户重新输入正确表达式;否则,返回正确的表达式。
第三步,对表达式进行处理,将运算数和运算符按照“计算器算法”分别压入栈中,并在此过程中记录顶元素的变化情况。
第四步,最后,返回结果,打印输出。
二、设计方案
(1)数据结构设计
任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;
2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。
(2)数据存储结构
因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。
定义两个栈的类型如下:
/* 定义字符类型栈 */
typedef struct{
int stacksize;
char *base;
char *top;
} Stack;
/* 定义整型栈 */
typedef struct{
int stacksize;
int *base;
int *top;
} Stack2;
1. Precede(char c1,char c2) 判断运算符优先权,返回优先权高的。
算符间的优先关系如下:
+ - * / ( ) # + - * / ( = ) # = 算法步骤:
第一步,如果输入符号位“+”或“减”。
如果栈顶元素为“(”,“#”,此时栈顶符号优先级高,返回“”;否则,栈顶符号优先级高,返回“”。
第二步,如果输入符号为“*”或“/”。
如果栈顶元素为“)”“*”“/”,此时栈顶元素符号优先级高,返回“”,否则,栈顶符号优先级低,返回“”。
第三步,如果输入符号为“(”,则直接返回“”。
第四步,如果输入符号为“)”.
如果栈顶原素为“(”,此时优先级同,返回“=”否则栈顶符号优先级高,返回“”。
第五步,输入符号为其他。
栈顶元素为“#”,此时优先级同,返回“=”;否则,栈顶元素符号优先级高,返回“” 。
算法代码
char Precede(char c1,char c2)
{
static char array[49]={
, , , , , , ,
, , , , , , ,
, , , , , , ,
, , , , , , ,
, , , , , =, !,
, , , , !, , ,
, , , , , !, =}; //用一维数组存储49种情况
switch(c1)
{
/* i为下面array的横标 */
case + : i=0;break;
case - : i=1;break;
case * : i=2;break;
case / : i=3;break;
case ( : i=4;break;
case ) : i=5;break;
case # : i=6;break;
}
switch(c2)
{
/* j为下面array的纵标 */
case + : j=0;break;
case - : j=1;b
文档评论(0)