福师大计算机系数据结构实验三.docx
- 文档编号:30744979
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:16
- 大小:115.06KB
福师大计算机系数据结构实验三.docx
《福师大计算机系数据结构实验三.docx》由会员分享,可在线阅读,更多相关《福师大计算机系数据结构实验三.docx(16页珍藏版)》请在冰豆网上搜索。
福师大计算机系数据结构实验三
实验报告(三):
栈及其应用
科目:
数据结构与算法实验1专业:
计算机科学与技术
班级:
计本班姓名:
学号:
日期:
2012-10-11
1实验目的
1)掌握顺序栈的类型定义方法。
2)掌握在顺序栈上实现的六种基本操作。
3)掌握顺序栈的简单应用。
4)掌握链栈的实现、并能够清楚对比栈的两种实现方法的优劣。
2实验内容
1)设计和实现一个栈数据结构(可以是顺序栈,链栈)。
2)实现栈数据结构的各种操作,包括栈的初始化、出入栈、清空和释放栈等。
3)在上述实现的栈的基础上,实现栈的应用:
写一个算法,完成表达式的求值。
4)上述栈的实现和应用不限制顺序栈或者链式栈,两者皆可。
3实验要求
1)提前预习该实验相关的内容,包括栈的两种实现方法,以及具体存储结构上的各类栈操作。
2)选择其中一种存储方法加以实现,并完成相关操作实现。
3)设计并实现算法完成实验内容中表达式的求值。
4)编写完整的程序完成实验内容,并上机调试和运行。
5)整理并上交实验报告。
6)本次实验要求在4学时内完成。
4数据结构设计
4.1栈结构设计(采取单链表的结构)
类图的设计:
4.2基本操作
所要实现的基本操作:
1)完成表达式的求值。
5实现
5.1设计实现
//"public.h"
#pragmaonce
#pragmaregion声明
#include
#include
//malloc()等函数
#include
//INT_MAX
#include
//EOF(=^Z或F6),NULL
#include
//atoi()
#include
//eof()
#include
#include
//exit()
#include
//cout,cin
#include
usingnamespacestd;
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
typedefintStatus;
typedefintBoolean;
typedefcharSElemType;
#pragmaendregion
//"DefinitionForSqStack.h"栈的定义
#pragmaonce
#include"public.h"
#defineSTACK_INIT_SIZE10
#defineSTACKINCREMENT2
//顺序栈
structSqStack
{
//在栈构造之前和销毁之后,base的值为NULL
SElemType*base;
//栈顶指针
SElemType*top;
//当前已经分配的存储空间,以元素为单位
intstacksize;
};
5.2操作实现
5.2.1顺序栈的操作实现
//"DefinitionForSqStack.h"
#pragmaonce
#include"public.h"
#defineSTACK_INIT_SIZE10
#defineSTACKINCREMENT2
StatusInitStack(SqStack&s)
{
if(!
(s.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
{
//存储分配失败
exit(OVERFLOW);
}
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&s)
{
//销毁栈s,s不再存在
free(s.base);
s.base=NULL;
s.top=NULL;
s.stacksize=0;
return0;
}
StatusClearStack(SqStack&s)
{
//把s置为空栈
s.top=s.base;
returnOK;
}
StatusStackEmpty(SqStack&s)
{
//若栈s为空栈,则返回TRUE,否则返回FALSE
if(s.top==s.base)
{
returnTRUE;
}
else
{
returnFALSE;
}
}
StatusStackLength(SqStack&s)
{
//返回s的元素个数,即栈的长度
returns.top-s.base;
}
StatusGetTop(SqStack&s,SElemType&e)
{
//若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR
if(s.top>s.base)
{
e=*(s.top-1);
returnOK;
}
else
{
returnERROR;
}
}
StatusPush(SqStack&s,SElemType&e)
{
//插入元素e为新的栈顶元素
if(s.top-s.base>=s.stacksize)
{
//栈满,新申请存储空间
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
s.base)
{
//存储空间分配失败
exit(OVERFLOW);
}
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*(s.top)++=e;
returnOK;
}
StatusPop(SqStack&s,SElemType&e)
{
//若栈不空。
则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(s.top==s.base)
{
returnERROR;
}
e=*--s.top;
returnOK;
}
5.2.2程序操作设计实现
//"design.h"
#pragmaonce
#include"DefinitionForSqStack.h"
SElemTypePrecede(SElemTypet1,SElemTypet2){
SElemTypef;
switch(t2){
case'+':
case'-':
if(t1=='('||t1=='='){
f='<';
}
else{
f='>';
}
break;
case'*':
case'/':
if(t1=='*'||t1=='/'||t1==')'){
f='>';
}
else{
f='<';
}
break;
case'(':
if(t1==')'){
return'#';
}
else{
f='<';
}
break;
case')':
switch(t1){
case'(':
f='=';break;
case'=':
return'#';break;
default:
f='>';
}break;
case'=':
switch(t1){
case'=':
f='=';break;
case'(':
return'#';break;
default:
f='>';
}break;
}
returnf;
}
StatusIn(SElemTypec){
switch(c){
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'=':
returnTRUE;
default:
returnFALSE;
}
}
SElemTypeOperate(SElemTypea,SElemTypetheta,SElemTypeb){
SElemTypec;
switch(theta){
case'+':
c=a+b;break;
case'-':
c=a-b;break;
case'*':
c=a*b;break;
case'/':
c=a/b;break;
}
returnc;
}
SElemTypeEvaluateExpression(){
SqStackOPTR,OPND;
SElemTypea,b,d,x,theta;
charc;
SElemTypedy='=';
SElemTyperesult;
charz[6];
inti;
InitStack(OPTR);
Push(OPTR,dy);
InitStack(OPND);
c=getchar();
GetTop(OPTR,x);
while(c!
='='||x!
='='){
if(In(c)){
SElemTypechoose=Precede(x,c);
if(choose=='#'){
return'#';
}
else{
switch(choose){
case'<':
Push(OPTR,c);c=getchar();break;
case'=':
Pop(OPTR,x);c=getchar();break;
case'>':
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
result=Operate(a,theta,b);
Push(OPND,result);
}
}
}
elseif(c>='0'&&c<='9'){
i=0;
do{
z[i]=c;
i++;
c=getchar();
}while(c>='0'&&c<='9');
z[i]=0;
d=atoi(z);
Push(OPND,d);
}
else{
return'#';
}
GetTop(OPTR,x);
}
GetTop(OPND,x);
returnx;
}
StatusTitle(){
cout<<"\"实验报告三\"整数运算范围内的算术表达式求值\"[版本.0.1.1]"< <<"版权所有(c)2012Corporation。 保留所有权利。 "< returnOK; } StatusHelpInput(){ cout<<"输入表达式。 "< <<"输入示例: "< <<"#Ixpsea\\Users\\管理员>input"< <<"-9"< <<"请输入整数算术表达式,负数要用(-正数)表示,输入参数请用‘=’结束..."< <<"Pleaseinputendwiththesymbolof‘=’..."< returnOK; } StatusHelpMenu(){ cout<<"有关某个命令的详细信息,请键入help命令名"< <<"input输入表达式"< <<"exit退出"< <<"有关命令的详细信息,请参阅帮助文档。 "< returnOK; } StatusHelpExit(){ cout<<"退出程序(命令解释器)。 "< returnOK; } Statuschange(charcommand[]){ if(strcmp(command,"exit")==0){ return1; } elseif(strcmp(command,"helpexit")==0||strcmp(command,"exit/? ")==0){ return11; } elseif(strcmp(command,"help")==0||strcmp(command,"/? ")==0||strcmp(command,"? ")==0){ return2; } elseif(strcmp(command,"input")==0){ SElemTyperesult=EvaluateExpression(); if(result! ='#'){ cout<<(int)result< return3; } else{ return31; } } elseif(strcmp(command,"helpinput")==0||strcmp(command,"input/? ")==0){ return32; } else{ return1011; } } StatusOperation(charcommand[],bool&out){ intchoose=change(command); switch(choose){ case1: out=true; break; case11: HelpExit(); break; case2: HelpMenu(); break; case3: ;break; case31: cout<<"表达式语法不正确,"< <<"有关语法的详细信息,请键入>helpinput"< case32: HelpInput();break; default: cout<<"\'"< <<"或命令语法不正确..."< } returnOK; } 5.3数据结构应用 这里主要是main函数对所实现的类应用 //biaoDaShiQiuZhi.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include"design.h" int_tmain(intargc,_TCHAR*argv[]) { charcommand[100]; boolout=false; Title(); while(! out){ cout<<"#Ixpsea\\Users\\管理员>"; if(gets_s(command)&&command[0]){ Operation(command,out); } } return0; } 6实验结果 (实验结果的输入,输出对应如下: ) 7存在问题和分析 一切正常。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 师大 计算机系 数据结构 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)