数据结构实验——队列(附程序)
数据结构实验指导书(C++)-栈、队列、串的操作

数据结构实验指导书(C++)-栈、队列、串的操作实验二栈、队列、串的操作实验类型:验证性实验要求:必修实验学时: 2学时一、实验目的:参照给定的栈类和队列类的程序样例,验证给出的栈和队列的常见算法,并结合线性表类实现有关串的操作。
二、实验要求:1、掌握栈、队列、串的特点。
掌握特殊线性表的常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:1. 堆栈类测试和应用问题。
要求:(1)设计一个主函数实现对顺序堆栈类和链式堆栈类代码进行测试。
测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
(2)定义数据元素的数据类型为如下形式的结构体:typedef struct{ char taskname[10];//任务名int taskno; //任务号}DataType;设计一个包含5个数据元素的测试数据,并设计一个主函数实现依次把5个数据元素入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
2. 队列类测试和应用问题。
要求:设计一个主函数对循环队列类和链式队列类代码进行测试.测试方法为:依次把数据元素1,2,3,4,5入队,然后出队中的数据元素并在屏幕上显示。
3.设计串采用顺序存储结构,编写函数实现两个串的比较Compare(S, T)。
要求比较结果有大于、等于和小于三种情况。
*4. 设计算法利用栈类实现把十进制整数转换为二至九进制之间的任一进制输出。
*5. 设计串采用静态数组存储结构,编写函数实现串的替换Replace(S, start, T, V),即要求在主串S中,从位置start开始查找是否存在子串T,若主串S中存在子串T,则用子串V替换子串T,且函数返回1;若主串S中不存在子串T,则函数返回0。
并要求设计主函数进行测试。
一个测试例子为:S=”I am a student”,T=”student”,V=”teacher “。
数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。
学习基本的查找和排序技术。
让我们在实际上机中具有编制相当规模的程序的能力。
养成一种良好的程序设计风格。
实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。
本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。
②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。
本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。
㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。
数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告1.实验目的本实验旨在通过设计栈和队列的数据结构,加深对栈和队列的理解,并通过实际操作进一步掌握它们的基本操作及应用。
2.实验内容2.1 栈的实现在本实验中,我们将使用数组和链表两种方式实现栈。
我们将分别实现栈的初始化、入栈、出栈、判断栈是否为空以及获取栈顶元素等基本操作。
通过对这些操作的实现,我们可将其用于解决实际问题中。
2.2 队列的实现同样地,我们将使用数组和链表两种方式实现队列。
我们将实现队列的初始化、入队、出队、判断队列是否为空以及获取队头元素等基本操作。
通过对这些操作的实现,我们可进一步了解队列的特性,并掌握队列在实际问题中的应用。
3.实验步骤3.1 栈的实现步骤3.1.1 数组实现栈(详细介绍数组实现栈的具体步骤)3.1.2 链表实现栈(详细介绍链表实现栈的具体步骤)3.2 队列的实现步骤3.2.1 数组实现队列(详细介绍数组实现队列的具体步骤)3.2.2 链表实现队列(详细介绍链表实现队列的具体步骤)4.实验结果与分析4.1 栈实验结果分析(分析使用数组和链表实现栈的优缺点,以及实际应用场景)4.2 队列实验结果分析(分析使用数组和链表实现队列的优缺点,以及实际应用场景)5.实验总结通过本次实验,我们深入了解了栈和队列这两种基本的数据结构,并利用它们解决了一些实际问题。
我们通过对数组和链表两种方式的实现,进一步加深了对栈和队列的理解。
通过实验的操作过程,我们也学会了如何设计和实现基本的数据结构,这对我们在日后的学习和工作中都具有重要意义。
6.附件6.1 源代码(附上栈和队列的实现代码)6.2 实验报告相关数据(附上实验过程中所产生的数据)7.法律名词及注释7.1 栈栈指的是一种存储数据的线性数据结构,具有后进先出(LIFO)的特点。
栈的操作主要包括入栈和出栈。
7.2 队列队列指的是一种存储数据的线性数据结构,具有先进先出(FIFO)的特点。
队列的建立及操作

队列的建⽴及操作数据结构与算法 --> 实验报告 4实验项⽬名称:队列的建⽴及操作⼀、实验⽬的1.掌握队列存储结构的表⽰和实现⽅法。
2.掌握队列的⼊队和出队等基本操作的算法实现。
⼆、实验题建⽴顺序循环队列,并在顺序循环队列上实现⼊队、出队基本操作。
三、实验过程及结果①基本思路:采⽤⼀种循环的结构去实现队列的顺序存储,队满和队空时标志都是 Q->front=Q->rear;为了区别两种情况,我的思路是:修改队满条件,浪费⼀个元素空间,当只有⼀个空闲单元时队满。
程序代码:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define MAXSIZE 10typedef int QElemType;typedef struct{QElemType \*base;int front;int rear;}SqQueue;Status InitQueue(SqQueue \*Q){Q->base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));if (Q->base==NULL) exit(OVERFLOW);Q->front = Q->rear = 0;return OK;}Status EnQueue(SqQueue \*Q,QElemType e){if ((Q->rear + 1) % MAXSIZE == Q->front)return ERROR;Q->base[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;return OK;}Status DeQueue(SqQueue *Q, QElemType *e){if (Q->front == Q->rear)return ERROR;*e = Q->base[Q->front];Q->front = (Q->front + 1) % MAXSIZE;return OK;}int main() {SqQueue Q;QElemType e;InitQueue(&Q);for (int i = 2; i < 7; i++){EnQueue(&Q, i);printf("⼊队元素为%d\n", i);}for (int j=2; j <7; j++) {DeQueue(&Q, &e);printf("出队元素为%d\n", e);}return 0;}②实验结果:四、实验总结队列的顺序存储采⽤循环队列,为了区分队空和队满,当只有⼀个空闲单元时队满。
数据结构实验报告2栈、队列、递归程序设计

日期:学号:姓名:
实验名称:实验报告二栈、队列、递归程序设计
实验目的与要求:
2.1栈和队列的基本操作
(1)正确理解栈的先进后出的操作特点,建立初始栈,通过相关操作显示栈底元素。
(2)程序中要体现出建栈过程和取出栈底元素后恢复栈的入栈过程,按堆栈的操作规则打印结果栈中的元素
{
return(s->top==-1);
}
//---出栈函数
int Pop(SeqStack *&s,ElemType &e)
{
if (s->top==-1)
return 0;
e=s->data[s->top];
s->top--;
return 1;
}
//---初始队列函数
void InitQueue(SqQueue *&q)
q->rear=(q->rear+1)%MaxSize;
q->elem[q->rear]=e;
return 1;
}
//---出队列函数
int OutQueue(SqQueue *&q,ElemType &e)
{
if (q->front==q->rear) //队空
return 0;
q->front=(q->front+1)%MaxSize;
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(q)?"空":"非空"));
队列实验报告

队列实验报告队列实验报告引言:队列是一种常见的数据结构,它按照先进先出(FIFO)的原则管理数据。
在计算机科学中,队列被广泛应用于各种算法和数据处理任务中。
本实验旨在通过实际操作和观察,深入了解队列的特性和应用。
实验目的:1. 理解队列的基本概念和特性;2. 学会使用队列进行数据处理;3. 掌握队列在实际问题中的应用。
实验步骤:1. 队列的创建和初始化:首先,我们需要创建一个队列并进行初始化。
队列可以使用数组或链表来实现。
在本实验中,我们选择使用链表实现队列。
通过定义一个队列类,我们可以创建一个空队列,并为其设置头节点和尾节点。
2. 入队操作:入队操作是将元素添加到队列的末尾。
我们可以通过调用队列类的入队方法,在尾节点后插入新的节点。
在插入操作之前,我们需要判断队列是否为空。
如果队列为空,新节点将成为头节点和尾节点;如果队列不为空,新节点将链接到当前尾节点的后面,并成为新的尾节点。
3. 出队操作:出队操作是将队列中的第一个元素移除,并返回该元素的值。
我们可以通过调用队列类的出队方法,将头节点的下一个节点作为新的头节点,并返回旧的头节点的值。
在出队操作之前,我们同样需要判断队列是否为空。
如果队列为空,则无法进行出队操作。
4. 遍历队列:为了观察队列中的元素,我们可以使用遍历操作。
通过遍历队列,我们可以依次访问每个节点,并输出节点的值。
在遍历过程中,我们需要从头节点开始,依次访问每个节点的下一个节点,直到尾节点为止。
实验结果:通过上述实验步骤,我们可以得到以下结果:1. 队列的创建和初始化成功;2. 入队操作能够将元素添加到队列的末尾;3. 出队操作能够将队列中的第一个元素移除,并返回该元素的值;4. 遍历操作能够依次输出队列中的每个元素。
实验应用:队列在实际问题中有着广泛的应用。
以下是一些典型的应用场景:1. 消息队列:在分布式系统中,消息队列被用于异步通信和解耦。
生产者可以将消息发送到队列,而消费者可以从队列中获取消息并进行处理。
队列实验报告总结

队列实验报告总结队列实验报告总结引言:队列(Queue)是一种常用的数据结构,它按照先进先出(FIFO)的原则进行操作。
在本次实验中,我们通过实际操作和观察,深入了解了队列的特性和应用。
本文将对实验过程和结果进行总结和分析。
一、实验目的本次实验的目的是通过编写队列的相关操作代码,加深对队列数据结构的理解,并通过实际运行程序验证其正确性和效率。
同时,通过实验探索队列在现实生活中的应用场景。
二、实验过程1. 队列的基本操作我们首先实现了队列的基本操作,包括入队(enqueue)、出队(dequeue)、判空(isEmpty)和获取队首元素(front)等。
通过编写相应的代码,并在测试数据上进行验证,确保队列的基本操作正确无误。
2. 队列的应用场景在实验过程中,我们发现队列在现实生活中有许多应用场景。
例如,在银行排队叫号系统中,顾客按照先来先服务的原则排队等待办理业务;在操作系统中,进程调度也常使用队列来管理等待执行的任务。
通过这些实际例子,我们更加深入地理解了队列的实际应用。
三、实验结果通过对队列的基本操作进行测试,我们得出了以下实验结果:1. 队列的入队操作正常工作,能够将元素按照先后顺序加入队列。
2. 队列的出队操作也正常工作,能够按照先进先出的原则将元素从队列中取出。
3. 队列的判空操作能够正确判断队列是否为空。
4. 队列的获取队首元素操作能够返回队列中的第一个元素。
四、实验分析通过本次实验,我们对队列的特性和应用进行了深入了解。
队列的先进先出原则使得它在很多场景下都有着广泛的应用。
在实际编程中,队列常常用于解决问题中的先后顺序和依赖关系。
例如,在多线程编程中,任务的执行顺序可以通过队列来管理,保证每个任务按照特定的顺序执行。
此外,队列还可以用于缓冲区的实现。
在网络传输中,数据包的发送和接收往往存在速度不匹配的情况,通过使用队列作为缓冲区,可以实现数据的有序传输,保证数据的完整性和正确性。
同时,我们也发现队列的应用并不仅限于计算机领域,它在日常生活中也有着广泛的应用。
数据结构实验二

数据结构实验二数据结构实验二:队列与栈的实现一、实验目的本实验旨在通过实现队列和栈数据结构,加深对队列和栈实现原理的理解,并熟练掌握队列和栈的基本操作。
二、实验要求1.使用C/C++语言实现队列的基本操作:初始化队列、入队、出队、判空、判满等。
2.使用C/C++语言实现栈的基本操作:初始化栈、入栈、出栈、判空、判满等。
3.验证队列和栈的实现是否正确。
4.分析队列和栈的时间复杂度,并给出实验结果。
5.撰写实验报告,包括实验目的、实验原理、实验步骤、程序源代码、实验结果和分析、实验总结等内容。
三、实验原理1.队列:队列是一种先进先出(FIF0)的数据结构。
在队列中,数据元素按照进入队列的顺序排列,首元素是最先进入的元素,尾元素是最后进入的元素。
队列的基本操作有:初始化队列、入队、出队、判空、判满等。
2.栈:栈是一种后进先出(LIFO)的数据结构。
在栈中,数据元素按照进入栈的顺序排列,但是只能从栈顶进出,即最后进入的元素最先出栈。
栈的基本操作有:初始化栈、入栈、出栈、判空、判满等。
四、实验步骤1.实现队列的基本操作:1.初始化队列:创建一个空队列,并设置相关指针。
2.入队:将新元素插入到队尾。
3.出队:将队头元素删除,并返回其值。
4.判空:判断队列是否为空。
5.判满:判断队列是否已满。
2.实现栈的基本操作:1.初始化栈:创建一个空栈,并设置相关指针。
2.入栈:将新元素压入栈顶。
3.出栈:将栈顶元素弹出,并返回其值。
4.判空:判断栈是否为空。
5.判满:判断栈是否已满。
3.编写测试代码,验证队列和栈的基本操作是否正确。
4.进行性能测试,分析队列和栈的时间复杂度。
五、实验结果与分析1.队列的时间复杂度:●初始化队列:O(1)●入队:O(1)●出队:O(1)●判空:O(1)●判满:O(1)2.栈的时间复杂度:●初始化栈:O(1)●入栈:O(1)●出栈:O(1)●判空:O(1)●判满:O(1)3.根据实验结果可以看出,队列和栈的基本操作的时间复杂度都是O(1),即常数时间复杂度,具有高效性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int QueueLe ngth(SqQueue Q)
{
int i;
i=(Q.rear-Q.fro nt+MAXQSIZE)%MAXQSIZE;
printf(“队列长度%5d\n",i);
if(i)printf("队列非空“);
else
printf("队列为空");
return 0;
{
int *base;
int front;
int rear;
}SqQueue;
int Ini tQueue(SqQueue &Q)
{
Q.base=(i nt*)malloc(MAXQSIZE*sizeof(i nt)); if(!Q.base)exit(O);
Q.fro nt=Q.rear=0;
return 0;
实验三队列
•、实验目的
1.了解队列的特性。
2.掌握队列的顺序表示和实现。
3.掌握队列的链式表示和实现。
1
实验3.3队列的顺序表示和实现
编写一个程序实现顺序队列的各种基本运算(采用循环队列),
主程序,完成如下功能:
⑴
初始化队列。
⑵
建立顺序队列。
⑶
入队。
⑷
岀队。
(5)
判断队列是否为空。
⑹
取队头元素。
(7)
}//判断队列是否为空
int En Queue(SqQueue &Q,i nt e)
{
if((Q.rea叶1)%MAXQSIZE==Q.fro nt)return 0;
Q.base[Q.rear]=e;
Q.rear=(Q.rea r+1)%MAXQSIZE;
return 0;
}//将元素e入队
int DeQueue(SqQueue&Q,i nt e)
{
if(Q.fro nt==Q.rear)return 0;
e=Q.base[Q.fro nt];
prin tf("%5d\n",e);
Q.fron t=(Q.fr on t+1)%MAXQSIZE;
return 0;
}//删除元素e并返回其值
int GetHead(SqQueue&Q,i nt e)
遍历队列。
实验3.4队列的链式表示和实现
编写一个程序实现链队列的各种基本运算,并在此基础上设计 能:
(1)
初始化并建立链队列
⑵
入链队列。
⑶
岀链队列。
⑷
遍历链队列。
#i nclude<stdio.h>
#in clude<stdlib.h>
#defi ne MAXQSIZE 100 typedef struct
for(k=Q.fro nt;k!=Q.rear;k++)
{
if(!(Q.rear-Q.fr on t+MAXQSIZE)%MAXQSIZE)return 0;
e=Q.base[Q.fro nt];
printf("返回队头元素%5d\n",e);
return 0;
}//返回队头元素e
void Prin tQueue(SqQueue &amf("顺序队列中的元素:\n");