数据结构实验报告3.docx
- 文档编号:23032826
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:20
- 大小:18.84KB
数据结构实验报告3.docx
《数据结构实验报告3.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告3.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构实验报告3
实验报告(3)
实验名称
栈、队列实验
同组人姓名
实验性质
□基本操作●验证性
□综合性□设计性
实验日期
实验成绩
教师评价:
实验预习□实验操作□实验结果□实验报告□其它□
教师签名:
一、实验目的及要求
1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
2)本实验训练的要点是“栈”和“队列”的观点;
二、实验内容
1)利用栈,实现任一个表达式中的语法检查(如括号的匹配)。
2)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);
三、主要设备及软件
WinTc
四、实验流程、操作步骤或核心代码、算法片段
程序文件内容的设计和建立:
(一)栈结构
1、头文件:
#include
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
2、栈的存储结构定义:
typedefstruct{
char*base;
char*top;
charstacksize;
}sqstack;
3、栈的基本操作的函数定义:
a)栈的初始
voidinitstack(sqstack*s){
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
s->base)exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
b)插入操作:
voidpush(sqstack*s,chare){
if(s->top-s->base>=s->stacksize){
s->base=(char*)malloc((s->stacksize+STACKINCREMENT)*sizeof(char));
if(!
s->base)exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
}
c)删除操作:
voidpop(sqstack*s,char*e){
if(s->top==s->base)exit(0);
*e=*--s->top;
}
d)判空操作:
intstackempty(sqstacks){
if(s.base)
return1;
else
return0;
}
4、菜单界面的制作:
while(((ch=getchar())!
='#')&&flag){
switch(ch){
case'(':
case'[':
case'{':
push(&l,ch);
break;
case')':
if(l.top==l.base||*(l.top-1)!
='('){
ch=0;
printf("Error!
\n");
printf("Enter,please(Enter#toend.):
\n");
}
else
{pop(&l,&e);
printf("ok.\n");
printf("Enter,please(Enter#toend.):
\n");
}
break;
case']':
if(l.top==l.base||*(l.top-1)!
='['){
ch=0;
printf("Error!
\n");
printf("Enter,please(Enter#toend.):
\n");
}
else
{pop(&l,&e);
printf("ok.\n");
printf("Enter,please(Enter#toend.):
\n");
}
break;
case'}':
if(l.top==l.base||*(l.top-1)!
='{'){
ch=0;
printf("Error!
\n");
printf("Enter,please(Enter#toend.):
\n");
}
else
{pop(&l,&e);
printf("ok.\n");
printf("Enter,please(Enter#toend.):
\n");
}
break;
}
}
if(flag&&stackempty(l)){
printf("OK!
\n");
}
else{
printf("Error!
\n");
}
(二)队列顺序
1、头文件:
#include
#definemaxqsize100
2、队列的存储结构定义:
typedefstruct{
int*base;
intfront;
intrear;
}sqqueue;
3、队列的基本操作的函数定义:
·建立:
voidinitqueue(sqqueue*q){
q->base=(int*)malloc(maxqsize*sizeof(int));
if(!
q->base)exit(0);
q->front=q->rear=0;
}
·插入
voidenqueue(sqqueue*q,inte){
if((q->rear+1)%maxqsize==q->front)
printf("thequeueisfull:
\n");
else{q->base[q->rear]=e;
q->rear=(q->rear+1)%maxqsize;}
}
·删除
voiddequeue(sqqueue*q,inte){
if(q->front==q->rear)
printf("thequeueisempty\n");
else{e=q->base[q->front];
printf("shanchudeyuanshushi:
%ld\n",e);
q->front=(q->front+1)%maxqsize;}
}
4、菜单界面的制作:
while(ch!
='#'){
printf("1isenqueue\n"
"2isdelete\n"
"3isquit\n"
"enteronedata:
\n");
scanf("%d",&n);
switch(n){
case1:
printf("zaiduiliecharuxindeyuanshu;\n");
scanf("%ld",&x);
enqueue(&Q,x);
printf("thelengthofqueueis%d\n",queuelength(&Q));
printf("zhegeduilieshi:
\n");
print(&Q);
break;
case2:
printf("shanchuyigeshuju:
\n");
dequeue(&Q,m);
printf("thelengthofqueueis%d\n",queuelength(&Q));
printf("zhegeduilieshi:
\n");
print(&Q);
break;
case3:
ch='#';
}
}
(三)队列链式
1、头文件:
#include
#definenull0;
2、队列的存储结构定义:
typedefstructQnode{
intdata;
structQnode*next;
}Qnode,*Queueptr;
typedefstruct{
Queueptrfront;
Queueptrrear;
}linkqueue;
3、队列的基本操作的函数定义:
·建立:
char*initqueue(linkqueue*q){
q->front=q->rear=(Queueptr)malloc(sizeof(Qnode));
if(!
q->front)exit(0);
q->front->next=null;
return"ok,emptyqueuehasbeencreated";
}
·插入
voidenqueue(linkqueue*q,inte){
Queueptrp;
p=(Queueptr)malloc(sizeof(Qnode));
if(!
p)exit(0);
q->rear->next=p;
p->data=e;
q->rear=p;
p->next=null;
}
·删除
voiddequeue(linkqueue*q,int*e){
Queueptrp;
if(q->front==q->rear)exit(0);
p=q->front->next;
*e=p->data;
if(q->rear==p)q->rear=q->front;
elseq->front->next=p->next;
free(p);
}
·判空
char*queueEmpty(linkqueue*q){
if(q->front==q->rear)return"true,thequeueisempty";
elsereturn"false,thequeueisunempty";
}
4、菜单界面的制作:
for(i=0;i printf("shurudi%dgeshu: \n",i+1); scanf("%d",&x); enqueue(&Q,x); } print(&Q); instructions(); printf("? "); scanf("%d",&choice); while(choice! =-1){ switch(choice){ case1: printf("insertonedata: "); scanf("%d",&m); enqueue(&Q,m); print(&Q); break; case2: queueEmpty(&Q); print(&Q); break; case3: printf("enterthetimesofdeleting: \n"); scanf("%d",&t); for(i=0;i str=queueEmpty(&Q); printf("%s\n",str); dequeue(&Q,&w); printf("di%dcichuduilie,gaishuwei%d: \n",i+1,w); print(&Q); } break; } instructions(); printf("? "); scanf("%d",&choice); } 五、实验结果的分析与评价 栈和队列的逻辑结构和线性表相同,其特点在于运算受到了限制,栈按“后进先出”的规则进行操作,队列按“先进先出”的规则进行操作,因此称为运算受限制的线性表。 判断表达式中括号是否匹配,可通过栈来实现,简单说是当读入的字符为左括号时进栈,为右括号时退栈。 退栈时,若栈顶元素是其对应的左括号,则新读入的右括号与栈顶左括号就可消去,栈顶元素出栈;若不是其对应的左括号,则说明括号不匹配,算法结束。 如此下去,当输入表达式结束时,若栈为空,则说明表达式括号匹配,否则说明表达式括号不匹配。 另外,由于本题是对表达式的括号匹配问题进行检查,所以对于表达式中输入的不是括号的字符一律不进行处理。 队列是一种特殊的线性表,它的插入和删除操作分别在表的两端进行,插入的那端叫队尾,删除的那端叫队首。 程序: (一)栈(括号匹配) #include #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefstruct{ char*base; char*top; charstacksize; }sqstack; voidinitstack(sqstack*s){ s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); if(! s->base)exit(0); s->top=s->base; s->stacksize=STACK_INIT_SIZE; } voidpush(sqstack*s,chare){ if(s->top-s->base>=s->stacksize){ s->base=(char*)malloc((s->stacksize+STACKINCREMENT)*sizeof(char)); if(! s->base)exit(0); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; } intstackempty(sqstacks){ if(s.base) return1; else return0; } voidpop(sqstack*s,char*e){ if(s->top==s->base)exit(0); *e=*--s->top; } intmain(){ sqstackl; chare; charflag; charch; initstack(&l); flag=1; printf("Enter,please(Enter#toend.): \n"); while(((ch=getchar())! ='#')&&flag){ switch(ch){ case'(': case'[': case'{': push(&l,ch); break; case')': if(l.top==l.base||*(l.top-1)! ='('){ ch=0; printf("Error! \n"); printf("Enter,please(Enter#toend.): \n"); } else {pop(&l,&e); printf("ok.\n"); printf("Enter,please(Enter#toend.): \n"); } break; case']': if(l.top==l.base||*(l.top-1)! ='['){ ch=0; printf("Error! \n"); printf("Enter,please(Enter#toend.): \n"); } else {pop(&l,&e); printf("ok.\n"); printf("Enter,please(Enter#toend.): \n"); } break; case'}': if(l.top==l.base||*(l.top-1)! ='{'){ ch=0; printf("Error! \n"); printf("Enter,please(Enter#toend.): \n"); } else {pop(&l,&e); printf("ok.\n"); printf("Enter,please(Enter#toend.): \n"); } break; } } if(flag&&stackempty(l)){ printf("OK! \n"); } else{ printf("Error! \n"); } getch(); return0; } (二)队列顺序 #include #definemaxqsize100 typedefstruct{ int*base; intfront; intrear; }sqqueue; voidinitqueue(sqqueue*q){ q->base=(int*)malloc(maxqsize*sizeof(int)); if(! q->base)exit(0); q->front=q->rear=0; } voidenqueue(sqqueue*q,inte){ if((q->rear+1)%maxqsize==q->front) printf("thequeueisfull: \n"); else{q->base[q->rear]=e; q->rear=(q->rear+1)%maxqsize;} } voiddequeue(sqqueue*q,inte){ if(q->front==q->rear) printf("thequeueisempty\n"); else{e=q->base[q->front]; printf("shanchudeyuanshushi: %ld\n",e); q->front=(q->front+1)%maxqsize;} } intqueuelength(sqqueue*q){ return(q->rear-q->front+maxqsize)%maxqsize; } voidprint(sqqueue*q){ int*p;inti;inty=q->front; for(i=0;i p=q->base+y; printf("%d\t",*p); y=(y+1)%maxqsize; } printf("\n"); } voidmain(){ sqqueueQ;charch='i',zifu;intm,n,i;intx; initqueue(&Q); for(i=0;i<=3;i++){ printf("pleaseshurushuju: \n"); scanf("%d",&x); enqueue(&Q,x); } printf("zhegeduilieshi: \n"); print(&Q); while(ch! ='#'){ printf("1isenqueue\n" "2isdelete\n" "3isquit\n" "enteronedata: \n"); scanf("%d",&n); switch(n){ case1: printf("zaiduiliecharuxindeyuanshu;\n"); scanf("%ld",&x); enqueue(&Q,x); printf("thelengthofqueueis%d\n",queuelength(&Q)); printf("zhegeduilieshi: \n"); print(&Q); break; case2: printf("shanchuyigeshuju: \n"); dequeue(&Q,m); printf("thelengthofqueueis%d\n",queuelength(&Q)); printf("zhegeduilieshi: \n"); print(&Q); break; case3: ch='#'; } } getch(); } (三)队列链式 /*链式队列*/ #include #definenull0; typedefstructQnode{ intdata; structQnode*next; }Qnode,*Queueptr; typedefstruct{ Queueptrfront; Queueptrrear; }linkqueue; char*initqueue(linkqueue*q){ q->front=q->rear=(Queueptr)malloc(sizeof(Qnode)); if(! q->front)exit(0); q->front->next=null; return"ok,emptyqueuehasbeencreated"; } char*queueEmpty(linkqueue*q){ if(q->front==q->rear)return"true,thequeueisempty"; elsereturn"false,thequeueisunempty"; } voidenqueue(linkqueue*q,inte){ Queueptrp; p=(Queueptr)malloc(sizeof(Qnode)); if(! p)exit(0); q->rear->next=p; p->data=e; q->rear=p; p->next=null; } voiddequeue(linkqueue*q,int*e){ Queueptrp; if(q->front==q->rear)exit(0); p=q->front->next; *e=p->data; if(q->rear==p)q->rear=q->front; elseq->front->next=p->next; free(p); } voidprint(linkqueue*q){ Queueptrp; printf("thequeueis: \n"); for(p=q->front->next;p! =q->rear;){ printf("%d\t",p->data); p=p->next; } printf("%d\n",p->data); } voidinstructions(void) { printf("enterchoice: \n" "1toenqueue()\n" "2toqueueEmpty()\n" "3todequeue()\n"); } intmain(){ linkqueueQ;char*str;intchoice,i,n,x,m,z,t,w; str=initqueue(&Q)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告