栈与队列数据结构.docx
- 文档编号:23663681
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:16
- 大小:111.37KB
栈与队列数据结构.docx
《栈与队列数据结构.docx》由会员分享,可在线阅读,更多相关《栈与队列数据结构.docx(16页珍藏版)》请在冰豆网上搜索。
栈与队列数据结构
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
线性数据结构实验
班级:
学号:
姓名:
线性表算法实现与应用报告要求
1目的与要求:
1)掌握栈与队列的数据类型描述及特点;
2)掌握栈的顺序和链式存储存表示与基本算法的实现;
3)掌握队列的链式和循环存储表示与基本操作算法实现;
4)掌握栈与队列在实际问题中的应用和基本编程技巧;
5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数的运行过程抓获相关屏面验证程序设计的正确性;
7)认真书写实验报告,并在下周一以前按时提交。
2实验内容或题目
(一)必做题:
1、实现顺序栈的创建(初始化)、压入(插入)、弹出(删除)操作,要求给出栈的操作变化过程;
2、实现链栈的创建(初始化)、压入(插入)、弹出(删除)操作,要求给出栈的操作变化过程;
3、实现循环队列的创建、进队、出队等基本操作,并实时给出队列的操作变化状态;
4、实现链式队列的创建、进队、出队等基本操作,并实时给出队列的操作变化状态;
(二)选做题(有能力同学建议多做此类应用题目):
1、实现表达式求值算法;
2、用递归算法实现汉诺塔问题;
3、使用循环队列实现打印杨辉三角形算法。
3实验步骤与源程序
第一题
#defineTRUE1
#defineFALSE0
#defineStack_Size50
#include
usingnamespacestd;
typedefstruct
{
intelem[Stack_Size];
inttop;
}SeqStack;
voidInitStack(SeqStack*S)
{
S->top=-1;
}
intIsEmpty(SeqStack*S)
{
return(S->top==-1?
TRUE:
FALSE);
}
intIsFull(SeqStack*S)
{
return(S->top==Stack_Size-1?
TRUE:
FALSE);
}
intPush(SeqStack*S,intx)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
intPop(SeqStack*S,int*x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
}
intGetTop(SeqStack*S,int*x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
return(TRUE);
}
}
intmain()
{
SeqStackS;
intx;
inty;
inti;
InitStack(&S);
if(!
IsFull(&S))
cout<<"栈为空"< cout<<"输入要压入的元素: "< for(i=0;i<10;i++) { cin>>y; Push(&S,y); } GetTop(&S,&x); cout<<"栈首元素: "< cout< cout<<"弹出的元素为: "< while(! IsEmpty(&S)) { Pop(&S,&x); cout< } cout< return0; } 第二题 #defineTRUE1 #defineFALSE0 #include usingnamespacestd; typedefstructnode { intdata; structnode*next; }LinkStackNode; typedefLinkStackNode*LinkStack; intGetTop(LinkStacktop,int*x) { if(NULL==top->next) returnFALSE; *x=top->next->data; returnTRUE; } intIsEmpty(LinkStacktop) { returnNULL==top->next? TRUE: FALSE; } intInitStack(LinkStack*top) { *top=(node*)malloc(sizeof(node)); if(NULL==*top) returnFALSE; (*top)->next=NULL; returnTRUE; } intPush(LinkStacktop,intx) { LinkStackNode*temp; temp=(LinkStackNode*)malloc(sizeof(LinkStackNode)); if(temp==NULL) return(FALSE); temp->data=x; temp->next=top->next; top->next=temp; return(TRUE); } intPop(LinkStacktop,int*x) { LinkStackNode*temp; temp=top->next; if(temp==NULL) return(FALSE); top->next=temp->next; *x=temp->data; free(temp); return(TRUE); } voidmain() { LinkStackNode*s; InitStack(&s); intx,i; if(IsEmpty(s)) cout<<"栈为空"< cout<<"请输入要压入的元素: "< for(i=0;i<10;i++) { cin>>x; Push(s,x); } GetTop(s,&x); cout<<"栈的首元素为: "< cout< cout<<"弹出的元素依次为: "< while(! IsEmpty(s)) { Pop(s,&x); cout< } cout< } 第三题 #defineTRUE1 #defineFALSE0 #defineMAXSIZE50 #include usingnamespacestd; typedefstruct { intelement[MAXSIZE]; intfront; intrear; }SeqQueue; voidInitQueue(SeqQueue*Q) { Q->front=Q->rear=0; } intEnterQueue(SeqQueue*Q,intx) { if((Q->rear+1)%MAXSIZE==Q->front) return(FALSE); Q->element[Q->rear]=x; Q->rear=(Q->rear+1)%MAXSIZE; return(TRUE); } intDeleteQueue(SeqQueue*Q,int*x) { if(Q->front==Q->rear) return(FALSE); *x=Q->element[Q->front]; Q->front=(Q->front+1)%MAXSIZE; return(TRUE); } intGetHead(SeqQueue*Q,int*x) { if(Q->front==Q->rear) return(FALSE); *x=Q->element[Q->front]; return(TRUE); } intIsEmpty(SeqQueue*Q) { if(Q->front==Q->rear) return(TRUE); else return(FALSE); } voidmain() { SeqQueues; InitQueue(&s); intx,i; if(IsEmpty(&s)) cout<<"队列为空"< cout<<"请输入元素: "< for(i=0;i<10;i++) { cin>>x; EnterQueue(&s,x); } GetHead(&s,&x); cout<<"队列首元素为: "< cout< cout<<"弹出的元素依次为: "< while(! IsEmpty(&s)) { DeleteQueue(&s,&x); cout< } cout< if(IsEmpty(&s)) cout<<"空队列"< } 第四题 #defineTRUE1 #defineFALSE0 #include usingnamespacestd; typedefstructNode { intdata; structNode*next; }LinkQueueNode; typedefstruct { LinkQueueNode*front; LinkQueueNode*rear; }LinkQueue; intIsEmpty(LinkQueue*Q) { returnQ->front==Q->rear? TRUE: FALSE; } intGetTop(LinkQueue*Q,int*x) { if(NULL==Q->rear) returnFALSE; *x=Q->rear->data; returnTRUE; } intInitQueue(LinkQueue*Q) { Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(Q->front! =NULL) { Q->rear=Q->front; Q->front->next=NULL; return(TRUE); } elsereturn(FALSE); } intEnterQueue(LinkQueue*Q,intx) { LinkQueueNode*NewNode; NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(NewNode! =NULL) { NewNode->data=x; NewNode->next=NULL; Q->rear->next=NewNode; Q->rear=NewNode; return(TRUE); } elsereturn(FALSE); } intDeleteQueue(LinkQueue*Q,int*x) { LinkQueueNode*p; if(Q->front==Q->rear) return(FALSE); p=Q->front->next; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; *x=p->data; free(p); return(TRUE); } intmain() { LinkQueueq; intx,i; InitQueue(&q); if(IsEmpty(&q)) cout<<"队列为空"< cout<<"请输入要压入的元素: "< for(i=0;i<10;i++) { cin>>x; EnterQueue(&q,x); } GetTop(&q,&x); cout<<"队列首元素为: "< cout< cout<<"队列弹出的元素依次为: "< for(i=0;i<10;i++) { DeleteQueue(&q,&x); cout< } cout< return0; } 4测试数据与实验结果(可以抓图粘贴) 第一题 第二题 第三题 第四题 5结果分析与实验体会 这是第二次数据结构实验,这次老师只给了一些函数,而没给出主函数,相对于上次难度是增大了,可是考察的内容都是书本上最基本的,全都是书本上的思想和算法,因此只要掌握了书本上的内容,很多问题就可以迎刃而解了。 我感觉,最重要的还是把基础掌握,掌握了基础,很多问题就不是问题,只要按部就班就可以了。 这次试验,我感觉自己还有很多比较薄弱的地方,我感到自己对于指针的理解还不是很透彻,对于指针的运用也不是十分的熟练,因此,在后的学习中,我会更加重视这方面的学习,力争掌握这门学科。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 数据结构