数据结构实验报告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;iprintf("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;istr=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;ip=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)