数据结构实验报告3.docx

上传人:b****1 文档编号:23032826 上传时间:2023-04-30 格式:DOCX 页数:20 大小:18.84KB
下载 相关 举报
数据结构实验报告3.docx_第1页
第1页 / 共20页
数据结构实验报告3.docx_第2页
第2页 / 共20页
数据结构实验报告3.docx_第3页
第3页 / 共20页
数据结构实验报告3.docx_第4页
第4页 / 共20页
数据结构实验报告3.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构实验报告3.docx

《数据结构实验报告3.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告3.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构实验报告3.docx

数据结构实验报告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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1