实验二.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"<>x;
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
六、实验小结:
通过本实验让我学习了链式存储和顺序存储,也让我对于栈和队列这两种重要的数据结构有了深入的了解,让我更清楚了栈与队列各自特点以及他们的差异。
另外也清楚了这两种结构的内存储存方式,对于我将来的学习编程有很大的好处。