数据结构 实验二 栈队列算法设计.docx
- 文档编号:26464041
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:18
- 大小:191.52KB
数据结构 实验二 栈队列算法设计.docx
《数据结构 实验二 栈队列算法设计.docx》由会员分享,可在线阅读,更多相关《数据结构 实验二 栈队列算法设计.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构实验二栈队列算法设计
中国矿业大学计算机学院实验报告
课程名称大学计算机基础(理工类)实验名称_实验二栈、队列算法设计
班级姓名学号_____仪器组号_______实验日期_____
实验报告要求:
1.实验目的2.实验内容3.实验步骤
4.运行结果5.流程图6.实验体会
1.实验目的
1、熟悉栈、队列这种特殊线性结构的特性;
2、熟练掌握栈、队列在顺序存储结构和链表存储结构下的基本操作。
2.实验内容
基本题(必做):
1、分别就栈的顺序存储结构和链式存储结构实现栈的各种基本操作。
2、假设以带头结点的循环链表表示队列,并且只设一个指针指向对尾结点,
不设头指针,试设计相应的置队空、入队和出队的程序。
加强题:
3、设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如
xyzyx和xyzzyx都是中心对称的字符串。
提高题:
4、试编写程序,a.将中缀表达式计算转换成后缀表达式。
b.后缀表达式的计算实现4.2.2中的算法,要考虑实际运
算时,后缀表达式中相邻操作数的界定。
3.实验步骤
基本题1(顺序存储):
#include
#include
#include
constSTACK_INIT_SIZE=100;//存储空间初始分配量
constSTACKINCREMENT=10;//存储空间分配增量
typedefstruct{
int*base;//在构造之前和销毁之后,base的值为NULL
int*top;//栈顶指针
intstacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
voidInitStack(SqStack&S){
//构造一个空栈S
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
S.base)
exit(0);//存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
//cout<<"初始化完毕"< }//InitStack voidGetTop(SqStackS,int&e){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top==S.base) {cout<<"此栈为空! ! ! "< exit(0); } e=*(S.top-1); cout< //cout<<"取值结束"< }//GetTop voidPush(SqStack&S,inte){ //插入元素e为新的栈顶元素 if(S.top-S.base>S.stacksize){//栈满,追加存储空间 S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(! S.base) {cout<<"新分配空间失败! ! ! "< exit(0); } S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; //cout<<"插入元素成功"< }//Push voidPop(SqStack&S,int&e){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则 返回ERROR if(S.base==S.top) {cout<<"此栈为空栈,无法删除! ! ! "< exit(0); } e=*--S.top; //cout<<"删除成功! ! ! "< }//Pop voidClearStack(SqStack&S){ //把S置为空栈 if(S.base==S.top) cout<<"此栈已经为空! ! ! "< S.top=S.base; }//ClearStack voidmain(){ SqStackStack; intm,n,x,y,z,i=0; InitStack(Stack); cout<<"请输入您要建立的栈的大小: "< cin>>n; Stack.stacksize=n; do{ cout<<"请选择操作: "< cout<<""<<"1,进栈2,出栈3,查看栈顶值4,清空栈5, 退出"< cin>>m; switch(m){ case1: cout<<"请输入进栈值: "< cin>>z; if(i==Stack.stacksize) { cout<<"Sorry! ! ! "< ! "< 出! ! ! "< exit(0); } Push(Stack,z); i++; break; case2: Pop(Stack,x); cout< break; case3: cout<<"栈顶值为: "< GetTop(Stack,y); break; case4: ClearStack(Stack); break; case5: cout<<"Exit! ! "< break; default: cout<<"输入错误! ! ! 此程序将退出! ! ! "< exit(0); }//switch }while(m! =5); getch(); } 基本题1(链式存储): #include #include #include #include //链式栈 typedefstructStack{ Stack*next; intdata; }Stack,*SLink; typedefstruct{ SLinktop; intlength; }SqStack; voidInitStack(SqStack&S){ //构造一个空栈 S.top=NULL;//设栈顶指针的初值为"空" S.length=0;//空栈中元素个数为 }//InitStack voidPush(SqStack&S,int&e){ //在栈顶之上插入元素e为新的栈顶元素 SLinkp; p=newStack;//建新的结点 p->data=e; p->next=S.top; S.top=p; ++S.length; }//Push voidPop(SqStack&S,int&e){ //若栈不空,则删除S的栈顶元素,用e返回其值 if(! S.top) {cout<<"此栈为空栈! ! ! "< exit(0); } e=S.top->data; S.top=S.top->next; }//Pop voidGetTop(SqStack&S,int&e){ //若栈不空,取栈顶元素,用e返回其值 if(! S.top) {cout<<"此栈为空栈! ! ! "< exit(0); } e=S.top->data; cout< }//GetTop voidClearStack(SqStack&S){ // if(! S.top) cout<<"此栈已经为空! ! ! "< S.top=NULL; }//ClearStack voidmain(){ SqStackStack; InitStack(Stack); intm,n,x,y,z,i=0; cout<<"请输入您要建立的栈的大小: "< cin>>n; Stack.length=n; //需改正! ! ! do{ cout<<"请选择操作: "< cout<<""<<"1,进栈2,出栈3,查看栈顶值4,清空栈5, 退出"< cin>>m; switch(m){ case1: cout<<"请输入进栈值: "< cin>>z; if(i==n) { cout<<"Sorry! ! ! "< ! "< 出! ! ! "< exit(0); } Push(Stack,z); i++; break; case2: Pop(Stack,x); cout< break; case3: cout<<"栈顶值为: "< GetTop(Stack,y); break; case4: ClearStack(Stack); break; case5: cout<<"Exit! ! "< break; default: cout<<"输入错误! ! ! 此程序将退出! ! ! "< exit(0); }//switch }while(m! =5); getch(); getch(); } 基本题2: #include #include #include //队空、入队和出队 intn=0; typedefstructQ{ intdata; Q*next; }Q,*QLink; voidInitQ(QLink&q){ //构造一个队列 q->next=q; }//InitQ voidPush(QLink&q,int&e){ //入队 QLinkp; p=newQ; p->data=e; p->next=q->next; q->next=p; n++; }//Push voidOutQ(QLink&q,int&e){ //出队 QLinkp; QLinkt; p=newQ; t=newQ; p=q; inti; for(i=0;i<=n;i++){ if(p->next->data==e) { t=p->next; p->next=t->next; deletet; break; }//if p=p->next; }//for if(i==(n+1)){ cout<<"您所输入的值不存在! 此程序将退出! ! "< exit(0); } }//OutQ voidClearQ(QLink&q){ //置队空 q=q->next; }//ClearQ voidcheckQ(QLink&q,int&e){ //查看队尾元素 if(q->next==q){ cout<<"此队列为空! ! 程序将退出! ! "< exit(0); } e=q->next->data; }//check voidmain(){ intm,x,n,y; QLinkQu; Qu=newQ; InitQ(Qu); do{ cout<<"请选择操作: "< cout<<"1,入队2,出队3,查看队尾元素4,清空队列5,退 出"< cin>>x; switch(x){ case1: cout<<"请输入您想插入的值: "<<"\t"; cin>>m; Push(Qu,m); break; case2: cout<<"请输入您想出队的值: "<<"\t"; cin>>n; OutQ(Qu,n); cout< break; case3: checkQ(Qu,y); cout<<"队尾元素为: "< break; case4: ClearQ(Qu); break; case5: cout<<"Exit! ! ! ! ! "< break; default: cout<<"输入错误! ! ! 此程序将退出! ! ! "< exit(0); }//switch }while(x! =5); getch(); } 加强题3: #include #include usingnamespacestd; boolcomp(charx,chary){ if(x==y) returntrue; else returnfalse; }//comp voidmain(){ charstr[100]; cout<<"请输入字符串: "< cin>>str; inti=0,m; while(str[i]){ i++; } m=i%2; if(m){ intp=i-1,q=0; intj; for(j=0;j<(i-1)/2;j++){ if(! comp(str[q++],str[p--])) break; }//for if(j==(i-1)/2) cout<<"此字符串对称! ! ! "< else cout<<"此字符串不对称! ! ! "< }//if else{ intp=i-1,q=0; intj; for(j=0;j<(i/2);j++){ if(! comp(str[q++],str[p--])) break; }//for if(j==i/2) cout<<"此字符串对称! ! ! "< else cout<<"此字符串不对称! ! ! "< }//else } 4.运行结果 基本题1(顺序存储): 基本题1(链式存储): 基本题2: 加强题3: 5.实验体会 通过本次实验,让我对栈、队列的操作有了更深入的认识,不仅让我熟悉了栈、队列这种特殊线性结构的特性,还让我掌握了栈、队列在顺序存储结构和链表存储结构下的基本操作。 教师评价 优 良 中 及格 不及格 教师签名 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验二 栈队列算法设计 实验 队列 算法 设计