实验三 栈和队列.docx

上传人:b****2 文档编号:2627551 上传时间:2023-05-04 格式:DOCX 页数:21 大小:78.08KB
下载 相关 举报
实验三 栈和队列.docx_第1页
第1页 / 共21页
实验三 栈和队列.docx_第2页
第2页 / 共21页
实验三 栈和队列.docx_第3页
第3页 / 共21页
实验三 栈和队列.docx_第4页
第4页 / 共21页
实验三 栈和队列.docx_第5页
第5页 / 共21页
实验三 栈和队列.docx_第6页
第6页 / 共21页
实验三 栈和队列.docx_第7页
第7页 / 共21页
实验三 栈和队列.docx_第8页
第8页 / 共21页
实验三 栈和队列.docx_第9页
第9页 / 共21页
实验三 栈和队列.docx_第10页
第10页 / 共21页
实验三 栈和队列.docx_第11页
第11页 / 共21页
实验三 栈和队列.docx_第12页
第12页 / 共21页
实验三 栈和队列.docx_第13页
第13页 / 共21页
实验三 栈和队列.docx_第14页
第14页 / 共21页
实验三 栈和队列.docx_第15页
第15页 / 共21页
实验三 栈和队列.docx_第16页
第16页 / 共21页
实验三 栈和队列.docx_第17页
第17页 / 共21页
实验三 栈和队列.docx_第18页
第18页 / 共21页
实验三 栈和队列.docx_第19页
第19页 / 共21页
实验三 栈和队列.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验三 栈和队列.docx

《实验三 栈和队列.docx》由会员分享,可在线阅读,更多相关《实验三 栈和队列.docx(21页珍藏版)》请在冰点文库上搜索。

实验三 栈和队列.docx

实验三栈和队列

实验报告

 

课程名称数据结构课程设计

实验项目栈和队列的实现

实验仪器PC机一台

 

学院_____信息管理学院_______

专业电子商务

班级/学号___

学生姓名_____________

实验日期___12.4__

成绩_______________________

指导教师_________________

北京信息科技大学

信息管理学院

(课程上机)实验报告

实验课程名称:

数据结构课程设计专业:

电子商务班级:

商务1401

学号:

姓名:

__成绩:

实验名称

栈和队列的实现

实验地点

小营学院机房

实验时间

12.4.2015

1.实验目的:

1)熟练掌握栈和队列的特性;

2)熟练掌握栈的基本操作在顺序存储结构、链式存储结构上的实现;

3)熟练掌握队列的基本操作在顺序存储结构、链式存储结构上的实现。

2.实验要求:

1)学时为4学时;

2)在上机前完成源程序;

3)能在机器上正确、调试运行程序;

4)本实验需提交实验报告;

5)实验报告文件命名方法:

实验3_xx班_学号后两位_姓名.doc

3.实验内容和步骤:

1)实现链栈的基本操作

a)创建一个空的堆栈

b)清空堆栈

c)进栈操作

d)出栈操作

e)打印堆栈中的所有元素

利用上述算法完成下面的操作:

f)数值转换程序,可以实现十进制向任意进制数的转换。

g)括号匹配程序,可以实现任意括号序列的匹配功能,当括号匹配成功时,输出“括号匹配成功”,否则输出“括号匹配失败”

2)假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素(不设头指针),请实现队列的以下操作:

a)创建一个空队列

b)判队空

c)入队

d)出队

e)取队头元素

f)清空一个队列

g)打印队列中的所有元素

编写主函数,调用以上各基本操作。

4.实验过程:

1.

A)创建一个空队列

voidInit_LinkStack(LinkStack*L_pointer)

{

*L_pointer=NULL;

}

B)清空堆栈

voidSetNull_LinkStack(LinkStack*L_pointer)

{

Node*p,*q;

p=*L_pointer;

while(p!

=NULL)

{

q=p;

p=p->next;

free(q);

}

*L_pointer=NULL;

}

C)进栈操作

intPush_LinkStack(LinkStack*L_pointer,ElemTypex)

{

Node*p;

p=(LinkStack)malloc(sizeof(Node));

if(p==NULL)

returnOverFlow;

p->data=x;

p->next=*L_pointer;

*L_pointer=p;

returnOK;

}

D)出栈操作

intPop_LinkStack(LinkStack*L_pointer,ElemType*x_pointer)

{

Node*p;

if(Empty_LinkStack(*L_pointer)==True)

returnFalse;

else

{

*x_pointer=(*L_pointer)->data;

p=*L_pointer;

*L_pointer=(*L_pointer)->next;

free(p);

returnOK;

}

}

E)打印堆栈中的所有元素

voidShow_LinkStack(LinkStackL_pointer)

{

Node*p;

p=L_pointer;

if(p==NULL)

printf("\n此表为空!

\n");

else

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}

F)数值转换程序,可以实现十进制向任意进制数的转换。

voidconversion(intnum,intbase)

{

inttemp;

LinkStackp;

Init_LinkStack(&p);

while(num)

{

Push_LinkStack(&p,num%base);

num=num/base;

}

while(Empty_LinkStack(p)==False)

{

Pop_LinkStack(&p,&temp);

printf("%d",temp);

}

printf("\n");

SetNull_LinkStack(&p);

}

主函数:

#include"stdio.h"

#include"stdlib.h"

#defineTrue1

#defineOK1

#defineOverFlow-1

#defineFalse0

#defineN30

typedefintElemType;

typedefstructnode

{

ElemTypedata;

structnode*next;

}Node,*LinkStack;

voidInit_LinkStack(LinkStack*L_pointer)

{

*L_pointer=NULL;

}

voidSetNull_LinkStack(LinkStack*L_pointer)

{

Node*p,*q;

p=*L_pointer;

while(p!

=NULL)

{

q=p;

p=p->next;

free(q);

}

*L_pointer=NULL;

}

intEmpty_LinkStack(LinkStackL_pointer)

{

if(L_pointer==NULL)

returnTrue;

else

returnFalse;

}

intPush_LinkStack(LinkStack*L_pointer,ElemTypex)

{

Node*p;

p=(LinkStack)malloc(sizeof(Node));

if(p==NULL)

returnOverFlow;

p->data=x;

p->next=*L_pointer;

*L_pointer=p;

returnOK;

}

intPop_LinkStack(LinkStack*L_pointer,ElemType*x_pointer)

{

Node*p;

if(Empty_LinkStack(*L_pointer)==True)

returnFalse;

else

{

*x_pointer=(*L_pointer)->data;

p=*L_pointer;

*L_pointer=(*L_pointer)->next;

free(p);

returnOK;

}

}

voidShow_LinkStack(LinkStackL_pointer)

{

Node*p;

p=L_pointer;

if(p==NULL)

printf("\n此表为空!

\n");

else

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}

voidconversion(intnum,intbase)

{

inttemp;

LinkStackp;

Init_LinkStack(&p);

while(num)

{

Push_LinkStack(&p,num%base);

num=num/base;

}

while(Empty_LinkStack(p)==False)

{

Pop_LinkStack(&p,&temp);

printf("%d",temp);

}

printf("\n");

SetNull_LinkStack(&p);

}

intmain()

{

inti,j,a[N],b,c,d,e,f,temp;

LinkStackL_p;

Init_LinkStack(&L_p);

printf("请输入你想存入的元素个数:

\n");

scanf("%d",&b);

printf("请输入你想要存入的数:

\n");

for(i=0;i

{

scanf("%d",&a[i]);

Push_LinkStack(&L_p,a[i]);

}

Show_LinkStack(L_p);

printf("\n请输入你想出栈的元素个数\n");

scanf("%d",&c);

for(j=0;j

Pop_LinkStack(&L_p,&temp);

Show_LinkStack(L_p);

SetNull_LinkStack(&L_p);

d=Empty_LinkStack(L_p);

printf("\n清空栈操作");

if(d==1)

printf("\n栈已空\n");

else

printf("\n栈未空\n");

printf("请输入你想转换进制的数\n你想要转换成的进制:

\n");

scanf("%d",&e);

scanf("%d",&f);

conversion(e,f);

return0;

}

运行结果:

G)括号匹配程序,可以实现任意括号序列的匹配功能,当括号匹配成功时,输出“括号匹配成功”,否则输出“括号匹配失败”

#include"stdio.h"

#include"stdlib.h"

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

#defineOK1

#defineERROR0

#defineOVERFLOW-2

typedefintStatus;

typedefcharSElemType;

typedefstruct

{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack*S)

{

S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

returnOK;

}

StatusStackEmpty(SqStack*S)

{

if(S->top!

=S->base)returnERROR;

returnOK;

}

StatusPush(SqStack*S,SElemTypee)

{

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)

{

if(S->top==S->base)returnERROR;

*e=*--S->top;

returnOK;

}

StatusBracket(SqStack*S,char*str)

{

inti=0,flag1=0,flag2;

SElemTypee;

while(str[i]!

='\0')

{

switch(str[i])

{

case'(':

Push(S,'(');break;

case'[':

Push(S,'[');break;

case'{':

Push(S,'{');break;

case')':

{Pop(S,&e);

if(e!

='(')

flag1=1;

break;

}

case']':

{Pop(S,&e);

if(e!

='[')

flag1=1;

break;

}

case'}':

{Pop(S,&e);

if(e!

='{')

flag1=1;

break;

}

default:

break;

}

if(flag1)break;

i++;

}

flag2=StackEmpty(S);

if(!

flag1&&flag2)printf("正确!

\n");

elseprintf("错误!

\n");

returnOK;

}

intmain()

{

chartemp,flag='y';

while(flag=='y')

{

charstr[255];

SqStackS;

InitStack(&S);

printf("请输入一串字符:

");

scanf("%s",str);

scanf("%c",&temp);

Bracket(&S,str);

printf("doyouwanttotryagain(enteryagain):

");

scanf("%c",&flag);

printf("\n");

}

printf("close.\n");

}

2.

A)创建一个空队列

intInit_LinkQueue(LinkQueue*L)

{

(*L)

=(LinkQueue)malloc(sizeof(Node));

if((*L)==NULL)

returnError;

(*L)->rear=(*L);

returnOk;

}

B)判队空

intEmpty_LinkQueue(LinkQueue*L)

{

if((*L)->rear==(*L))

returnOk;

else

returnFalse;

}

C)入队

intPush_LinkQueue(LinkQueue*L,ElemTypex)

{

LinkQueuep;

p=(LinkQueue)malloc(sizeof(Node));

p->data=x;

(*L)->rear->next=p;

(*L)->rear=p;

p->next=(*L);

returnOk;

}

D)出队

intPop_LinkQueue(LinkQueue*L,ElemType*x_pointer)

{

LinkQueuetemp;

*x_pointer=(*L)->next->data;

temp=(*L)->next;

(*L)->next=(*L)->next->next;

free(temp);

returnOk;

}

E)取队头元素

intGetFront_LinkQueue(LinkQueue*L)

{

ElemTypex;

x=(*L)->next->data;

returnx;

}

F)清空一个队列

voidSetNull_LinkQueue(LinkQueueL)

{

Node*p,*q;

p=L->next;

while(p!

=L)

{

q=p;

p=p->next;

free(q);

}

L->next=L;

}

G)打印队列中的所有元素

voidShow_LinkQueue(LinkQueue*L)

{

Node*p;

p=(*L)->next;

while(p!

=(*L))

{

printf("%d",p->data);

p=p->next;

}

}

主函数:

#include"stdio.h"

#include"stdlib.h"

#defineN30

#defineError-1

#defineOk1

#defineFalse0

#defineOverFlow-1

typedefintElemType;

typedefstructQueue

{

ElemTypedata;

structQueue*rear;

structQueue*next;

}Node,*LinkQueue;

intInit_LinkQueue(LinkQueue*L)

{

(*L)

=(LinkQueue)malloc(sizeof(Node));

if((*L)==NULL)

returnError;

(*L)->rear=(*L);

returnOk;

}

voidSetNull_LinkQueue(LinkQueueL)

{

Node*p,*q;

p=L->next;

while(p!

=L)

{

q=p;

p=p->next;

free(q);

}

L->next=L;

}

intEmpty_LinkQueue(LinkQueue*L)

{

if((*L)->rear==(*L))

returnOk;

else

returnFalse;

}

intPush_LinkQueue(LinkQueue*L,ElemTypex)

{

LinkQueuep;

p=(LinkQueue)malloc(sizeof(Node));分配一个结点

p->data=x;数据域赋值

(*L)->rear->next=p;插入队尾

(*L)->rear=p;插入队尾

p->next=(*L);

returnOk;

}

intPop_LinkQueue(LinkQueue*L,ElemType*x_pointer)

{

LinkQueuetemp;备用指针

*x_pointer=(*L)->next->data;取队头元素到*x。

所指空间

temp=(*L)->next;头结点进入到备用指针

(*L)->next=(*L)->next->next;把对头元素变为队头元素的后继结点

free(temp);释放原来的队头元素

returnOk;返回操作成功标记

}

intGetFront_LinkQueue(LinkQueue*L)

{

ElemTypex;

x=(*L)->next->data;

returnx;

}

voidShow_LinkQueue(LinkQueue*L)

{

Node*p;

p=(*L)->next;

while(p!

=(*L))

{

printf("%d",p->data);

p=p->next;

}

}

intmain()

{

LinkQueueLQ;

inta[N],i,j,b,c,d,temp;

Init_LinkQueue(&LQ);

printf("请输入你想在队列里存入元素的个数:

\n");

scanf("%d",&b);

printf("请输入你要存入的元素:

\n");

for(i=0;i

{

scanf("%d",&a[i]);

Push_LinkQueue(&LQ,a[i]);

}

Show_LinkQueue(&LQ);

printf("\n请输入你想要出队的元素个数:

\n");

scanf("%d",&c);

for(j=0;j

Pop_LinkQueue(&LQ,&temp);

Show_LinkQueue(&LQ);

printf("\n取队头元素:

\n");

printf("%d\n",GetFront_LinkQueue(&LQ));

printf("清空队列操作:

\n");

SetNull_LinkQueue(LQ);

d=Empty_LinkQueue(&LQ);

if(d==1)

printf("该队列已空\n");

else

printf("该队列为空\n");

return0;

}

 

5.实验总结:

学习了链栈操作,会了进栈、退栈,进队、出队的操作。

说明:

1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;

2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;

3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;

4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;

5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

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

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2