实验报告——栈和队列的应用

时间:2019-05-12 14:10:16下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《实验报告——栈和队列的应用》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《实验报告——栈和队列的应用》。

第一篇:实验报告——栈和队列的应用

实验5 栈和队列的应用

目的和要求:

(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。

一、题目

题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。例如,a+b&b+a等等。

题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题,并实现。

题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。

题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。

题目5.利用循环链队列求解约瑟夫环问题。

请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。

选择题目3:

打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。

二、程序清单

//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现 { LinkNode*p;while(front!=NULL)//逐个删除队列中的结点

{

p=front;

front=front->link;

delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数

if(front==NULL){//判断是否为空

front=rear=new LinkNode;//如果为空,新结点为对头也为对尾

front->data=rear->data=x;

if(front==NULL)//分配结点失败

return false;} else{

rear->link=new LinkNode;//如不为空,在链尾加新的结点

rear->link->data=x;

if(rear->link==NULL)

return false;

rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空

{

return false;} cout<data<<“ ”;//输出链尾的数据,代表执行打印命令

LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改

delete p;//释放原结点

return true;};void main()

//主函数 { LinkedQueue q;//定义类对象

char flag='Y';

//标志是否输入了命令

const int max=30;//一次获取输入命令的最大个数 while(flag=='Y')//循环 { int i=0;char str[max];//定义存储屏幕输入的命令的数组

gets(str);//获取屏幕输入的命令

while(str[i]!=''){

q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中

i++;

}

for(int j=0;j<=i;j++){

if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令

{

cout<<“已经没有可执行的命令!是否继续输入命令(Y|N)?”<

cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备

}

q.carry_out();//调用执行命令的函数,将命令打印并删除

}

三、程序调试过程中所出现的错误 无。

四、运行结果:

五、心得体会

打印机采用的缓冲池技术,本质上就是利用了队列的先进先出的特点,体现了先来后到原则。虽然意思很简单,但是实际编程过程中,出现bug的概率还是蛮高的,因为在编写程序中一点疏忽就容易产生错误。

本来我对模板类的使用还是很模糊的,通过这个例子,至少让我清楚了模板类的使用和特点。觉得模板类的恰当使用,对于自己今后的编程好处还是很大的。

第二篇:2数据结构-实验报告二(栈和队列及其应用)

实验二 栈和队列及其应用

一、实验目的

1.掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。

2.熟练掌握栈类型的两种实现方法。

3.熟练掌握循环队列和链队列的基本操作实现算法。

二、实验内容

用队列求解迷宫问题 [问题描述] 以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。[基本要求] 实现一个以顺序存储结构的队列类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,pre)的形式输出,其中:(i,j)指示迷宫中的一个坐标,pre表示本路径中上一个方块在队列中的下标。

[测试数据] 由学生任意指定。

三、源代码

# include #define M 5 #define N 5

//行数 //列数

//队最多元素个数

//一个迷宫,其四周要加上均为1的外框{1,1, #define MaxSize 100 int mg[M+2][N+2]={ {1,1,1,1,1,1,1}, {1,0,0,0,0,0,1}, {1,0,1,0,0,1,1}, {1,0,1,0,0,1,1}, {1,0,1,0,1,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1} };

typedef struct {int i,j;int pre;} Box;typedef struct { Box data[MaxSize];int front, rear;}QuType;void mgpath1(int xi,int yi,int xe,int ye)//搜索路径为:(xi,yi){ void print(QuType qu, int front);->(xe,ye)

int i,j,find=0,di;QuType qu;//定义顺序队 qu.front=qu.rear=-1;qu.rear++;qu.data[qu.rear].i=xi;//(xi,yi)进队 qu.data[qu.rear].j=yi;qu.data[qu.rear].pre=-1;mg[xi][yi]=-1;while(qu.front!=qu.rear&&!find){qu.front++;i=qu.data[qu.front].i;j=qu.data[qu.front].j;if(i==xe&&j==ye){find=1;print(qu,qu.front);

}

for

(di=0;di<4;di++)

{

switch(di)

{

case 0 :i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break;case 1 :i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break;case 2 :i=qu.data[qu.front].i+1;j=qu.data[qu.front].j+1;break;case 3 :i=qu.data[qu.front].i;j=qu.data[qu.front].j-1;break;

}

if(mg[i][j]==0)

{find=1;

qu.rear++;

qu.data[qu.rear].i=i;qu.data[qu.rear].j=j;

qu.data[qu.rear].pre=qu.front;

mg[i][j]=-1;

}

} } }

void print(QuType qu, int front){

int k=front,j,ns=0;

printf(“n”);do

{j=k;

k=qu.data[k].pre;

qu.data[j].pre=-1;

} while(k!=0);printf(“迷宫路径如下:n”);k=0;while(k

ns++;

printf(“t(%d,%d)”,qu.data[k].i,qu.data[k].j);

if(ns%5==0)printf(“n”);} k++;} printf(“n”);} void main()

{ mgpath1(1,1,M,N);printf(“迷宫所有路径如下:n”);

}

四、测试结果:

五、心得体会

做实验首先要掌握大量的理论知识,然后认真去完成实验。做实验过程会碰见较大的困难,这就要需要我们的毅力。小小的迷宫隐藏大大的奥秘。

第三篇:实验三 栈和队列的应用

一、实验目的 掌握栈的数据类型描述及栈的特点; 掌握栈的顺序存储结构的特点及算法描述; 掌握队列的数据类型描述及链式存储结构的特点和算法描述。

二、实验内容

停车场管理。设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后依次从停车场最里面向大95E8口处停放(最先到达的第一辆车停放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。试编程模拟停车场管理。

三、算法描述

提示:可以将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。

当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。

车辆的数据可以表示为(车辆编号,到达/离开时间)。

四.程序清单: #include using namespace std;const int StackSize=5;class SeqStack { public:

SeqStack(){top=-1;} ~SeqStack(){};void Push(int x);void Push2(int x);int *Return();int Pop(int y);int Count();void PrintStack();private: int data[StackSize];int top;};//入栈

void SeqStack::Push(int x){ if(top>=StackSize-1)throw“上溢”;for(int i=0;i<=top+1;i++){

if(data[i]==x)

{

cout<<“该车牌已经存在!请重新输入: ”;

i=-1;

cin>>x;

} } top++;data[top]=x;} //返回数组地址

int *SeqStack::Return(){ return data;} //临时栈

void SeqStack::Push2(int x){ top++;data[top]=x;

} //输出函数

void SeqStack::PrintStack(){ for(int i=0;i<=top;i++)

cout<<“位置为”<

int SeqStack::Pop(int y){ if(top==-1)throw“下溢”;int x;x=data[top--];if(y==top+2)data[top+1]=123456789;if(top==-1)data[top+1]=123456789;return x;} //数数

int SeqStack::Count(){ return top;}

//队列

struct Node { int data;Node *next;};class LinkQueue { public: LinkQueue();void EnQueue(int x,int *q);void xzDeQueue(int x);int Count();int DeQueue();

private: Node *front,*rear;};//构造函数

LinkQueue::LinkQueue(){ Node *s=new Node;s->next=NULL;front=rear=s;} //入队

void LinkQueue::EnQueue(int x,int *q){ Node *s=new Node;Node *p=new Node;p=front;while(p){

if(p->data ==x)

{

cout<<“便道已有该车牌号,请重新输入: ”;

cin>>x;

for(int i=0;i<5;i++)

{

if(x==q[i])

{

cout<<“停车场已有该车牌号,请重新输入: ”;

cin>>x;

i=-1;

}

}

p=front;} p=p->next;} s->data =x;s->next =NULL;

rear->next =s;rear=s;} //出队

int LinkQueue::DeQueue(){ if(front==rear)throw“便道无车辆”;Node *p=new Node;int x;p=front->next;x=p->data;front->next =p->next;if(p->next ==NULL)rear=front;delete p;return x;} //计算结点数

int LinkQueue::Count(){ Node *p=new Node;p=front;int i=0;while(p&&p->next!=NULL){

p=p->next;

i++;} return i;} //选择性出队

void LinkQueue::xzDeQueue(int x){ if(rear==front)throw“便道无车辆”;Node *p=new Node;p=front;int y;int i=0;for(;p->next!=NULL;p=p->next)

{

if(p->next->data ==x)

if(p->next->next!=NULL)

{

Node *q=new Node;

q=p->next;

y=q->data;

p->next =q->next;

i=1;

delete q;

cout<<“车牌号为:”<

break;

}

else

{

Node *q=new Node;

q=p->next;

y=q->data;

p->next =NULL;

i=1;

delete q;

if(front->next==NULL)rear=front;

cout<<“车牌号为:”<

break;

}

} if(i==0)cout<<“无车牌号为:”<

SeqStack b;//b是作为临时存放车辆的栈

LinkQueue c;//c是作为便道的队列

cout<<“tttt1.车辆进入”<

cout<<“tttt4.便道车辆离开”<

int xh1=1;//xh1为菜单最外层的循环控制变量

int time[100];//记录各车辆进入停车场的时间

int t1=0;//作为车辆对应的时间编号

int money=1;while(xh1==1){

cout<<“请选择指令: ”;

cin>>zl;

switch(zl)

{

case 1:

try{

int n1=a.Count();

int n;

cout<<“请输入车牌号: ”;

cin>>n;

if(n1==4)

{

int *Num=a.Return();

for(int i=0;i<=4;i++)

if(Num[i]==n)

{

cout<<“停车场已有该车牌号,请重新输入!”;

cin>>n;

i=-1;

}

int *CarNum=a.Return();

c.EnQueue(n,CarNum);

cout<<“停车场已满,请在便道等候!”<

break;

}

a.Push(n);

cout<<“请输入进入时间: ”;

cin>>time[t1];

while(time[t1]<0||time[t1]>=24)

{

cout<<“请输入正确的时间(0~23时):”;

cin>>time[t1];

}

t1++;

}

catch(char*s){cout<

break;

case 2:

try{int n2;//离开车辆的编号

cout<<“请输入要离开的车的位置: ”;

cin>>n2;

if(a.Count()+1==0)

{

cout<<“该停车场没有车辆,请选择其他操作!”;

break;

}

else

while(n2<1||n2>a.Count()+1)

{

cout<<“请输入1~”<

cin>>n2;

}

int j=a.Count();

for(int i=0;i<(j+1-n2);i++)

b.Push2(a.Pop(n2));

a.Pop(n2);

int j2=b.Count();

for(int i1=0;i1<=j2;i1++)

a.Push(b.Pop(n2));

int j3=c.Count();

int time1;

cout<<“请输入离开时间: ”;

cin>>time1;

while(time1<0||time1>23)

{

cout<<“请输入正确的时间(0~23时): ”;

cin>>time1;

}

int day=0;

if(time1

{

cout<<“离开时间已小于进入时间!请加上停留天数(天):”;

cin>>day;

while(day<=0)

{

cout<<“输入的天数必须大于0:”;

cin>>day;

}

}

cout<<“您的费用是(元): ”<<(time1-time[n2-1]+24*day)*money<

for(int i2=0;i2<(j+1-n2);i2++)

time[n2-1+i2]=time[n2+i2];

t1--;

if(j3!=0)

{

a.Push(c.DeQueue());

cout<<“ttt通知: 便道车辆请进入停车场!”<

cout<<“请输入进入时间: ”;

cin>>time[t1];

while(time[t1]<0||time[t1]>=24)

{

cout<<“请输入正确的时间(0~23时):”;

cin>>time[t1];

}

t1++;

}

}catch(char *s){cout<

break;

case 3:

a.PrintStack();break;

case 4:

int n3;

cout<<“请输入离开车辆的车牌号: ”;

cin>>n3;try{

c.xzDeQueue(n3);}catch(char*s){cout<

break;

case 5:

cout<<“请输入单价: ”;

cin>>money;

cout<<“修改成功!”<

cout<<“当前停车场的费用是:”<

break;

case 6:

xh1=0;

break;

} } system(“pause”);}

心得体会:

完成时间:2010-10-30

第四篇:实验三 栈和队列

实验报告三 栈和队列

班级: 姓名: 学号: 专业:

一、实验目的:

(1)掌握栈的基本操作的实现方法。

(2)利用栈先进后出的特点,解决一些实际问题。(3)掌握链式队列及循环队列的基本操作算法。(4)应用队列先进先出的特点,解决一些实际问题。

二、实验内容:

1、使用一个栈,将一个十进制转换成二进制。粘贴源程序:

package Word1;

public class Node {

} T data;Node next;public Node(T a){ } public Node(T a,Node n){

} this.data=a;this.next=n;this(a,null);

-----package Word1;

public class Stack {

} public Node Top;public Stack(){ } public void push(T a){ } public T Out(){

}

T a=this.Top.data;this.Top=this.Top.next;return a;this.Top=new Node(a,this.Top);this.Top=null;

--package Word1;

import java.util.*;

public class Test {

} static Scanner scan=new Scanner(System.in);static int temp=0;static int a=0;static Stack s=new Stack();public static void main(String[] args){

} temp=scan.nextInt();while(true){

} while(s.Top!=null){

} System.out.printf(“%d”,s.Out());a=temp%2;s.push(a);temp=temp/2;if(temp==0)break;

粘贴测试数据及运行结果:

2、回文是指正读反读均相同的字符序列,如“acdca”、“dceecd”均是回文,但“book”不是回文。利用1中的基本算法,试写一个算法判定给定的字符串是否为回文。(提示:将一半字符入栈,依次弹出与另一半逐个比较)粘贴源程序:---------package Word1;

import java.util.*;public class Test1 {

} static Scanner sc=new Scanner(System.in);static char[] c={'a','b','c','b','a'};static Stack s=new Stack();public static void main(String[] args){

} public static String One(){

} public static String Two(){

} for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2;i

} return “该字符串是回文”;if(s.Out()!=c[i])return “该字符不是回文”;s.push(c[i]);for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2+1;i

} return “该字符串是回文”;if(s.Out()!=c[i])return “该字符串不是回文”;s.push(c[i]);if(c.length%2!=0){

} else{ } System.out.println(Two());System.out.println(One());

-------------

粘贴测试数据及运行结果:

3、使用3个队列分别保留手机上最近10个“未接来电”、“已接来电”、“已拨电话”。

粘贴源程序:

package Word3;

import java.util.*;

public class Queue {

LinkedList list;public Queue(){ } public void enQ(E a){ } public E deQ(){ } public boolean isEmpty(){ } public void Pri(){ while((list.isEmpty()))return list.isEmpty();return list.removeLast();list.addLast(a);list=new LinkedList();

} } System.out.printf(“%d n”,this.deQ());

package Word3;

import java.util.*;

public class Test {

static Queue list1=new Queue();static Queue list2=new Queue();static Queue list3=new Queue();static Scanner sc=new Scanner(System.in);public static void main(String[] args){ } public static void Frame(){

} static private void T2(){

int c;int[] a={22324,321321,222333};for(int i=0;i

1、查询

2、增加”);c=sc.nextInt();if(c==1){

} else{ c=sc.nextInt();while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());list2.enQ(a[i]);int c=0;System.out.println(“请选择记录类型:”);System.out.println(“

1、未接来电

2、已接来电

3、已拨电话”);switch(c=sc.nextInt()){

} case 1:T1();break;case 2:T2();break;case 3:T3();break;Frame();

}

} list2.enQ(c);while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());sc.close();static private void T3(){

} static private void T1(){

int c;int[] a={12324,321321,222333};for(int i=0;i

1、查询

2、增加”);c=sc.nextInt();if(c==1){

} else{ c=sc.nextInt();while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());list1.enQ(a[i]);int c;int[] a={32324,321321,222333};for(int i=0;i

1、查询

2、增加”);c=sc.nextInt();if(c==1){

} else{

} sc.close();c=sc.nextInt();list3.enQ(c);while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());list3.enQ(a[i]);

}

}

} list1.enQ(c);while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());sc.close();

粘贴测试数据及运行结果:

三、心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)

第五篇:数据结构栈与队列报告

栈和队列上机实习

1、实验目的:

(1)熟练掌握栈的逻辑结构和操作规则,能在相应的实际问题中正确选用该结构。(2)熟练掌握栈的2种存储结构实现方法(顺序栈和链栈),两种存储结构和基本运算的实

现算法,注意栈空盒满的判断条件及它们的描述方法。

(3)熟练掌握队列的逻辑结构和操作规范,能在相应的实际问题中正确选用该结构。(4)掌握循环队列与链队列两种存储结构的实现,熟练掌握各种队列基本运算的实现。

2、实验要求:

(1)顺序栈的插入、删除,栈顶数据元素的读取。(2)链栈的插入、删除,栈顶数据元素的读取。(3)循环队列的插入、删除。(4)链队列的插入、删除。

3、实验内容: ① 栈

(1)抽象数据类型定义

typedef struct

{

ElemType data[MaxSize];

//栈的空间大小为MaxSize

int top;

//设置栈顶指针

}SqStack;

//栈的结构定义

在本次实验中,首先建立一个空栈,进入主程序后首先初始化栈为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入栈,出栈,读取栈顶元素,显示栈的所有元素,栈的长度,释放栈等操作。

(2)存储结构定义及算法思想

在栈结构体的定义中,typedef int Typeelem 为整型,存储结构(入栈)如下:

cin>>a;

s->top++;

//在入栈是首先将栈顶指针向上加1

s->data[s->top]=a;

//与数组赋值一样,直接赋值

//其他存储与此类似,都是直接赋值与数组的某一位

退栈函数模块:

void Pop(SqStack * &s){

//对指针的引用

if(s->top ==-1){

cout<<“栈是空栈,不能退栈”<

//首先判断是否为空栈,若为空,则退出

return;} cout<<“退栈的元素为:”<data[s->top]<

//显示退栈元素

s->top--;

//栈顶元素减1,指向实际栈的最上面 }

显示栈所有元素函数模块:

void DispStack(SqStack *s){

//从栈顶到栈底顺序显示所有元素

int i;cout<<“栈的元素分别为:”<top;i>=0;i--){ cout<data[i]<<“ ”;

//同过循环实现实现从栈顶元素到栈底元素的遍历以输出

} cout<

栈结构的入栈和退栈是两个相反的过程,先进后出,入栈是先让栈顶指针加1,指向未被赋值位置,然后进行赋值,退栈是先取出退栈元素,然后栈顶元素减1,指向推展后的实际栈顶。诸如读取栈顶元素,显示栈的元素,读取栈的长度,都是用过对栈顶指针实现相关操作。

(3)实验结果与分析

② 循环队列

(1)抽象数据类型定义

typedef struct {

ElemType elem[Maxqsize];

//循环队列的长度为MaxSize

int front,rear;

//设置队列的头指针和尾指针

}SqQueue;

//循环队列的结构体定义

在本次实验中,首先建立一个空队列,进入主程序后首先初始化队列为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入队,出队,显示队列的所有元素,队列的长度,释放队列等操作。

(2)存储结构定义及算法思想

在队列结构体的定义中,typedef int Typeelem 为整型,存储(入队)结构如下:

q->rear=(q->rear+1)%Maxqsize;

//尾指针加1

q->elem[q->rear]=a;

//将入队元素装到新的空尾部

在此队列的存储结构的实现:先让队尾指针进1,再将新的元素加入到队尾指针所指示的位置,因此,队尾指针指示实际的队尾位置,队头指针指示实际队头的前一位置,要想退出队头元素,必须先让队头指针进1,才能取出队头元素。

退队函数模块如下:

void deQueue(SqQueue *&q){

//对指针的引用

if(QueueEmpty(q))

{

//调用带返回值的判断空队函数

cout<<“队列为空”<

//判断队列是否为空

}

q->front=(q->front+1)%Maxqsize;

//队头指针进1

cout<<“退队的元素为:”<elem[q->front]<

//取出队头元素 }

遍历队表函数:

void displayqueue(SqQueue *q){

int m;m=q->front+1;

//队头元素进1,指向实际队头

if(QueueEmpty(q))

{

cout<<“队列为空”<

//判断是够为空队

}

cout<<“所有队列元素为:”<

while(q->rear+1>m){

cout<elem[m]<<“ ”;

//通过循环遍历所有元素

m++;

}

cout<

循环队列的入队和退队分别是在队尾与队头跟别进行操作的,通过队头队尾指针的操作便可实现对队列的相关操作。

(3)实验结果与分析

③ 心得体会

本次上机是做栈与队列的操作,这次实验,我有意的用到了对指针的引用与指针实现子函数功能的调用,刚开始编译的时候也有错误,但是在慢慢的摸索中,也逐渐掌握了它们的用法,这次实验也让我熟练了对队列与栈存储结构的应用。

附录:

顺序表源代码: 栈:

#include using namespace std;#define MaxSize 5 typedef int ElemType;int e;typedef struct { ElemType data[MaxSize];int top;}SqStack;

void InitStack(SqStack * &s)

//建立一个空栈,即将栈顶指针指向-1即可 的引用 { s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}

void ClearStack(SqStack * &s)

//释放栈s占用的存储空间 { free(s);}

void StackLength(SqStack *s)

{ cout<<“栈的长度为:” <<(s->top +1)<

int StackEmpty(SqStack *s){ return(s->top==-1);}

void Push(SqStack *&s){ if(s->top==MaxSize-1)

{

cout<<“栈满”<

//

s=(SqStack *)realloc(s,sizeof(SqStack));} int a;

指针

cout<<“请输入入栈元素”<>a;s->top++;s->data[s->top]=a;}

void Pop(SqStack * &s){ if(s->top ==-1){

cout<<“栈是空栈,不能退栈”<

return;} cout<<“退栈的元素为:”<data[s->top]<top--;}

void GetTop(SqStack * &s,ElemType &e){ if(s->top==-1){cout<<“空栈”<data[s->top];}

void DispStack(SqStack *s)

//从栈顶到栈底顺序显示所有元素 { int i;cout<<“栈的元素分别为:”<top;i>=0;i--){ cout<data[i]<<“ ”;} cout<

cout<<“请选择功能”<

cout<<“

入栈

1”<

cout<<“

出栈

2”<

cout<<“

读取栈顶元素

3”<

cout<<“

显示栈所有元素

4”<

cout<<“

栈的长度

5”<

cout<<“

释放栈

6”<

cin>>k;

switch(k)

{

case 1: Push(s);break;

case 2: Pop(s);break;

case 3: GetTop(s,e);cout<<“栈顶元素为: ”<

case 4: DispStack(s);break;

case 5: StackLength(s);break;

case 6: ClearStack(s);break;

default :break;

} } }

队列:

#include using namespace std;#define Maxqsize 8 typedef int TypeElem;typedef struct {

TypeElem elem[Maxqsize];

int front,rear;}SqQueue;void InitQueue(SqQueue *&q){

q=(SqQueue *)malloc(sizeof(SqQueue));

q->front=q->rear=0;} void ClearQueue(SqQueue *&q){

free(q);exit(0);} void QueueLength(SqQueue *q){

cout<<“队列长度为:”<<(q->rear-q->front+Maxqsize)%Maxqsize<

return(q->front==q->rear);

} void enQueue(SqQueue *&q){ int a;

if((q->rear+1)%Maxqsize==q->front)

{

cout<<“队列已满,无法插入”<

}

cout<<“请输入插入元素”<

cin>>a;

q->rear=(q->rear+1)%Maxqsize;

q->elem[q->rear]=a;} void deQueue(SqQueue *&q){

if(QueueEmpty(q))

{

cout<<“队列为空”<

}

q->front=(q->front+1)%Maxqsize;

cout<<“退队的元素为:”<elem[q->front]<

}

void displayqueue(SqQueue *q){

int m;m=q->front+1;

if(QueueEmpty(q))

{

cout<<“队列为空”<

}

cout<<“所有队列元素为:”<

while(q->rear+1>m)

{

cout<elem[m]<<“ ”;

m++;

}

cout<

int k=0;

SqQueue *q;

InitQueue(q);

if(QueueEmpty(q))cout<<“队列为空”<

while(1){

cout<<“请选择功能”<

cout<<“

入队

cout<<”

出队

cout<<“

队列长度

cout<<”

显示队列元素

cout<<“

释放栈

cin>>k;

switch(k)

{

case 1: enQueue(q);break;

case 2: deQueue(q);break;

case 3: QueueLength(q);break;

case 4: displayqueue(q);break;

case 5: ClearQueue(q);break;

default :break;

} } }

1”<

2“<

4“<

下载实验报告——栈和队列的应用word格式文档
下载实验报告——栈和队列的应用.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    实验总结报告-栈和队列(大全5篇)

    实验总结报告—栈和队列 学号:姓名: 时间: 一、目的 1.做实验的目的 加深对线性结构栈和队列的理解,学会定义栈和队列的存储结构,加强对栈和队列操作机制的理解,掌握栈和队列的基......

    数据结构 队列实验报告

    队列实验报告 小组成员:xxxxxxxx日期:xxxxxxxx 一、需求分析(xxx) 1.链队列 1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一......

    栈队列实验指导书(共5篇)

    数理学院实验指导书 实验三 栈与队列的实现,栈的应用 【实验目的】 1、掌握栈和队列的特点,即先进后出与先进先出的原则。 2、掌握栈和队列的顺序存储结构和链式存储结构及其......

    使用队列栈结构反序输出字符串

    队列结构 实验目的 1.熟练掌握栈和队列的特点。 2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。 3.掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用, 掌握环形......

    消息队列通信实验报告

    实验6 消息队列通信 实验目的 1、了解什么是消息、消息队列2、掌握消息传送的机理 实验内容 1、 消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及ms......

    ​搜索引擎应用实验报告

    搜索引擎应用实验报告1.实训目的(1)掌握Internet常用的检索工具和使用方法。(2)熟悉Internet信息检索和科技资源等。2.实训环境(1)网络实验室。(2) Internet 上网环境。3.实......

    PHP综合应用实验报告

    PHP综合应用实验报告 班 级:10网工三班学生姓名:谢昊天 学号:1215134046 实验目的和要求: 1、使学生理解PHP网站开发流程; 2、使学生能够把平时所学的知识进行统一的整合; 3、使......

    数据库应用基础实验报告

    电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 一、实验一: 名称 创建数据库 二、实验学时:4 三、实验内容和目的:实验要求学生掌握创建数据库的方法及相关......