实验二.docx
- 文档编号:30457951
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:14
- 大小:294.33KB
实验二.docx
《实验二.docx》由会员分享,可在线阅读,更多相关《实验二.docx(14页珍藏版)》请在冰豆网上搜索。
实验二
班级:
学号:
姓名:
实验组别:
实验日期:
报告日期:
成绩:
报告内容:
(目的和要求、原理、步骤、数据、计算、小结等)
实验名称:
栈与队列
一、实验目的
(1)掌握栈、队列的思想及其存储实现。
(2)掌握栈、队列的常见算法的程序实现。
二、实验要求
(1).编写函数,采用链式存储实现栈的初始化、入栈、出栈操作。
(2).编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作。
(3).编写函数,采用链式存储实现队列的初始化、入队、出队操作。
(4).编写函数,采用顺序存储实现队列的初始化、入队、出队操作。
(5).编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
三、实验原理(流程图):
四、实验数据(源代码):
#include
#defineERROR0
#defineOK1
#defineMAX100//栈的最大值
usingnamespacestd;
typedefintSElemType;
typedefintQElemType;
typedefstruct
{SElemType*base;
SElemType*top;
}SqStack;
voidInitStacka(SqStack&S)//顺序存储实现栈的初始化
{
S.base=(SElemType*)newSElemType[MAX];
if(!
S.base)cout<<"申请空间失败";
S.top=S.base;
}
voidPusha(SqStack&S,intx)//顺序存储实现栈的入栈操作
{if(S.top-S.base>=MAX)cout<<"栈已满";
*S.top++=x;
}
voidPopa(SqStack&S)//顺序存储实现栈的出栈操作
{SElemType*p;
intx;
if(S.top==S.base)return;
else{p=S.top;
x=*--S.top;
cout<<"删除的栈顶元素是"< "< } } voidprinta(SqStackS)//输出 {SElemType*p; p=S.base; cout< while(p! =S.top) {cout<<*(p++);} cout< } typedefstructSqNode {SElemTypedata; SqNode*Link; }*Sqptr,NODE; typedefstruct {Sqptrtop; }Stack; voidInitStackb(Stack&S)//链式存储实现栈的初始化 {; S.top=(Sqptr)newNODE; if(! S.top)cout<<"申请空间失败"; S.top->Link=NULL; } voidPushb(Stack&S,intx)//链式存储实现栈的入栈操作 {Sqptrp; p=(Sqptr)newNODE; if(! p)return; p->data=x; p->Link=S.top->Link; S.top->Link=p; } voidPopb(Stack&S)//链式存储实现栈的出栈操作 {intx; Sqptrp; if(S.top->Link==NULL)return; else{p=S.top->Link; x=p->data; S.top->Link=p->Link; cout<<"删除的栈顶元素是"< free(p);} } typedefstructQNode {QElemTypedata; structQNode*next; }*QueuePtr,QNode; typedefstruct {QueuePtrfront; QueuePtrrear; }LinkQueue; voidInitQueue(LinkQueue&Q)//链式存储实现队列的初始化 { Q.front=Q.rear=(QueuePtr)newQNode; if(! Q.front)cout<<"申请空间失败"; Q.front->next=NULL; } voidEnQueue(LinkQueue&Q,QElemTypex)//链式存储实现队列的入队 {QueuePtrp; p=(QueuePtr)newQNode; if(! p)cout<<"栈已满"; p->data=x; p->next=NULL; Q.rear->next=p; Q.rear=p; } voidDeQueue(LinkQueue&Q)//链式存储实现队列的出队 {intx; if(Q.front==Q.rear)return; QueuePtrp; p=Q.front->next; x=p->data; cout<<"删除的队头元素是: "< Q.front->next=p->next; if(Q.rear==p)Q.rear=Q.front; free(p); return; } typedefstruct {SElemType*base; intfront,rear; }SqQueue; voidInitQueueb(SqQueue&S)//顺序存储实现队列的初始化 { S.base=(SElemType*)newSElemType[MAX]; if(! S.base)cout<<"申请空间失败"; S.front=S.rear=0; } voidEnQueueb(SqQueue&S,intx)//顺序存储实现队列的入队 {if((S.rear+1)%MAX==S.front)return; S.base[S.rear]=x; S.rear=(S.rear+1)%MAX; } voidDeQueueb(SqQueue&S)//顺序存储实现队列的出队 {intx; if(S.front==S.rear)return; x=S.base[S.front]; S.front=(S.front+1)%MAX; cout<<"删除的队头元素是: "< } intmain() {intchoice; do { intn,x; inttui=1; cout< cout<<"栈与队列"; cout< cout<<"---------------------------------------------"< cout<<"1.采用顺序存储实现栈的初始化、入栈、出栈操作"< cout<<"2.采用链式存储实现栈的初始化、入栈、出栈操作"< cout<<"3.采用顺序存储实现队列的初始化、入队、出队操作"< cout<<"4.采用链式存储实现队列的初始化、入队、出队操作"< cout<<"5.退出使用"< cout<<"---------------------------------------------"< cout<<"请选择: "; cin>>choice; switch(choice) {case1: SqStackS; cout<<"---------------------------------------------"< cout<<"1.顺序存储实现栈的初始化"< cout<<"2.顺序存储实现栈的入栈操作"< cout<<"3.顺序存储实现栈的出栈操作"< cout<<"4.退出\n"; cout<<"---------------------------------------------"< while(tui){ cout<<"请选择: "; cin>>n; switch(n) {case1: InitStacka(S); cout<<"顺序存储栈的初始化完成! "< break; case2: cout<<"以'0'结束"< cout< cin>>x; while(x) { Pusha(S,x); cin>>x;} cout<<"顺序存储栈的入栈操作完成! "< printa(S); break; case3: Popa(S); printa(S); break; case4: tui=0; } } break; case2: StackSa; cout<<"---------------------------------------------"< cout<<"1.链式存储实现栈的初始化"< cout<<"2.链式存储实现栈的入栈操作"< cout<<"3.链式存储实现栈的出栈操作"< cout<<"---------------------------------------------"< while (1){ cout<<"请选择: "; cin>>n; switch(n) {case1: InitStackb(Sa); cout<<"链式存储栈的初始化完成! "< break; case2: cout<<"以'0'结束\n"< cout< cin>>x; while(x){ Pushb(Sa,x);cin>>x;} cout<<"链式存储栈的入栈操作完成! "< case3: Popb(Sa);break;}}break; case3: SqQueueSv; cout<<"---------------------------------------------"< cout<<"1.顺序存储实现队的初始化"< cout<<"2.顺序存储实现队的入栈操作"< cout<<"3.顺序存储实现队的出栈操作"< cout<<"---------------------------------------------"< while (1){ cout<<"请选择: "; cin>>n; switch(n) {case1: InitQueueb(Sv); cout<<"链式存储栈的初始化完成! "< case2: cout<<"以'0'结束\n"< while(x){ EnQueueb(Sv,x);scanf("%d",&x);} cout<<"链式存储栈的入栈操作完成! "< case3: DeQueueb(Sv); break; } }break; case4: LinkQueueQ; cout<<"---------------------------------------------"< cout<<"1.链式存储实现队的初始化"< cout<<"2.链式存储实现队的入栈操作"< cout<<"3.链式存储实现队的出栈操作"< cout<<"---------------------------------------------"< while (1) {cout<<"请选择: "; cin>>n; switch(n) { case1: InitQueue(Q); cout<<"链式存储队的初始化完成! "< break; case2: cout<<"以'0'结束";cout< cin>>x; while(x){ EnQueue(Q,x);cin>>x;} cout<<"链式存储队的入栈操作完成! "< case3: DeQueue(Q); break; } }break; } }while(choice! =5); return0; } 五、程序运行结果: 1.采用顺序存储实现栈的初始化、入栈、出栈操作。 图2 2.采用链式存储实现栈的初始化、入栈、出栈操作 图2 3.采用顺序存储实现队列的初始化、入队、出队操作。 图3 4.采用链式存储实现队列的初始化、入队、出队操作 图4 5.退出使用 图5 六、实验小结: 通过本实验让我学习了链式存储和顺序存储,也让我对于栈和队列这两种重要的数据结构有了深入的了解,让我更清楚了栈与队列各自特点以及他们的差异。 另外也清楚了这两种结构的内存储存方式,对于我将来的学习编程有很大的好处。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)