实验三 栈和队列及其应用(I)

合集下载

栈和队列的实验报告

栈和队列的实验报告

栈和队列的实验报告栈和队列的实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在算法设计和程序开发中起着重要的作用。

本实验旨在通过实际操作和观察,深入理解栈和队列的概念、特点以及它们在实际应用中的作用。

一、栈的实验1.1 栈的定义和特点栈是一种具有特殊操作约束的线性数据结构,它的特点是“先进后出”(Last-In-First-Out,LIFO)。

栈的操作包括入栈(push)和出栈(pop),入栈操作将元素放入栈顶,出栈操作将栈顶元素移除。

1.2 实验步骤在本次实验中,我们使用编程语言实现了一个栈的数据结构,并进行了以下实验步骤:1.2.1 创建一个空栈1.2.2 向栈中依次压入若干元素1.2.3 查看栈顶元素1.2.4 弹出栈顶元素1.2.5 再次查看栈顶元素1.3 实验结果通过实验,我们观察到栈的特点:最后入栈的元素最先出栈。

在实验步骤1.2.2中,我们依次压入了元素A、B和C,栈顶元素为C。

在实验步骤1.2.4中,我们弹出了栈顶元素C,此时栈顶元素变为B。

二、队列的实验2.1 队列的定义和特点队列是一种具有特殊操作约束的线性数据结构,它的特点是“先进先出”(First-In-First-Out,FIFO)。

队列的操作包括入队(enqueue)和出队(dequeue),入队操作将元素放入队尾,出队操作将队头元素移除。

2.2 实验步骤在本次实验中,我们使用编程语言实现了一个队列的数据结构,并进行了以下实验步骤:2.2.1 创建一个空队列2.2.2 向队列中依次插入若干元素2.2.3 查看队头元素2.2.4 删除队头元素2.2.5 再次查看队头元素2.3 实验结果通过实验,我们观察到队列的特点:最先入队的元素最先出队。

在实验步骤2.2.2中,我们依次插入了元素X、Y和Z,队头元素为X。

在实验步骤2.2.4中,我们删除了队头元素X,此时队头元素变为Y。

三、栈和队列的应用栈和队列在实际应用中有广泛的应用场景,下面简要介绍一些常见的应用:3.1 栈的应用3.1.1 表达式求值:通过栈可以实现对表达式的求值,如中缀表达式转换为后缀表达式,并计算结果。

栈与队列的应用

栈与队列的应用

栈与队列的应用栈(Stack)和队列(Queue)是计算机科学中常见的数据结构,它们分别具有先进后出(Last-In-First-Out, LIFO)和先进先出(First-In-First-Out, FIFO)的特性。

这两种数据结构在计算机领域有着广泛的应用,本文将介绍一些栈与队列的常见应用场景。

一、栈的应用1. 括号匹配栈常被用于判断表达式中的括号是否匹配。

通过遍历表达式中的每个字符,将左括号入栈,当遇到右括号时,检查栈顶元素与右括号是否匹配。

若匹配,则出栈;若不匹配,则说明括号不匹配。

2. 浏览器的前进与后退功能在浏览器中,我们可以通过点击前进和后退按钮来在不同的网页之间切换。

这种功能可以使用两个栈来实现:一个栈用于存储用户浏览的历史页面,另一个栈用于存储用户后退的页面。

当用户点击前进按钮时,从后退栈中弹出页面并推入历史页面栈;当用户点击后退按钮时,从历史页面栈中取出页面并推入后退页面栈。

3. 函数调用与递归在程序中,函数的调用是通过栈来实现的。

当一个函数被调用时,系统会将该函数的返回地址和参数等信息压入栈中;当函数执行完毕后,从栈中弹出返回地址,继续执行调用函数的下一条指令。

4. 表达式求值中缀表达式求值通常需要借助栈来实现。

通过将表达式转换成后缀表达式,并使用栈存储运算符和操作数,可以按照规定的优先级进行计算,得到最终的结果。

二、队列的应用1. 打印任务队列在计算机系统中,多个用户同时提交打印任务时,可以使用队列来管理这些任务。

每当有新的任务到达时,将其加入队列尾部,打印机则从队列头部取出任务进行打印。

这样可以保证任务的顺序性,并避免多个任务之间的冲突。

2. 消息队列在分布式系统中,消息队列通常用于解耦不同模块之间的通信。

一个模块可以将消息发送到队列中,而其他模块可以异步地从队列中获取消息并进行相应的处理。

这种方式提高了系统的可伸缩性和稳定性。

3. 广度优先搜索在图论中,广度优先搜索(Breadth-First Search, BFS)可以借助队列来实现。

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告摘要:本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和解决方法。

本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。

1. 实验一:线性表的操作1.1 实验目的本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。

1.2 实验过程我们使用C++语言编写了线性表的相关算法,并在实际编程环境下进行了测试。

通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。

1.3 实验结果经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。

这些结果与预期相符,并反映了线性表的基本特性。

1.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。

通过仔细分析问题,我们优化了算法的实现,并解决了这些问题。

2. 实验二:栈和队列的应用2.1 实验目的本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编程实现。

2.2 实验过程我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境下进行了测试。

通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。

2.3 实验结果经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达式的计算,队列的应用可以实现图的广度优先遍历。

这些结果证明了栈和队列在实际应用中的重要性和有效性。

2.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如中缀表达式转后缀表达式的算法设计、表达式求值的优化等。

通过查阅资料和与同学的讨论,我们解决了这些问题,并完善了算法的实现。

3. 实验三:串的模式匹配3.1 实验目的本实验旨在掌握串的基本操作和模式匹配算法,并进行实际编程实现。

栈与队列实验报告总结

栈与队列实验报告总结

栈与队列实验报告总结实验报告总结:栈与队列一、实验目的本次实验旨在深入理解栈(Stack)和队列(Queue)这两种基本的数据结构,并掌握其基本操作。

通过实验,我们希望提高自身的编程能力和对数据结构的认识。

二、实验内容1.栈的实现:我们首先使用Python语言实现了一个简单的栈。

栈是一种后进先出(LIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的栈操作:push(插入元素)和pop(删除元素)。

2.队列的实现:然后,我们实现了一个简单的队列。

队列是一种先进先出(FIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的队列操作:enqueue(在队尾插入元素)和dequeue(从队头删除元素)。

3.栈与队列的应用:最后,我们使用所实现的栈和队列来解决一些实际问题。

例如,我们使用栈来实现一个算术表达式的求值,使用队列来实现一个简单的文本行编辑器。

三、实验过程与问题解决在实现栈和队列的过程中,我们遇到了一些问题。

例如,在实现栈的过程中,我们遇到了一个“空栈”的错误。

经过仔细检查,我们发现是因为在创建栈的过程中没有正确初始化栈的元素列表。

通过添加一个简单的初始化函数,我们解决了这个问题。

在实现队列的过程中,我们遇到了一个“队列溢出”的问题。

这是因为在实现队列时,我们没有考虑到队列的容量限制。

通过添加一个检查队列长度的条件语句,我们避免了这个问题。

四、实验总结与反思通过本次实验,我们对栈和队列这两种基本的数据结构有了更深入的理解。

我们掌握了如何使用Python语言实现这两种数据结构,并了解了它们的基本操作和实际应用。

在实现栈和队列的过程中,我们也学到了很多关于编程的技巧和方法。

例如,如何调试代码、如何设计数据结构、如何优化算法等。

这些技巧和方法将对我们今后的学习和工作产生积极的影响。

然而,在实验过程中我们也发现了一些不足之处。

例如,在实现栈和队列时,我们没有考虑到异常处理和性能优化等方面的问题。

栈和队列的应用

栈和队列的应用

栈和队列的应用栈和队列是计算机科学中非常重要的数据结构,它们在各种应用中被广泛使用。

本文将探讨栈和队列的应用,并讨论它们在不同场景下的具体用途。

一、栈的应用1. 浏览器的前进后退功能在使用浏览器时,我们可以通过点击前进按钮或后退按钮来切换网页。

这种功能实际上是由一个栈来实现的。

当我们访问新的网页时,当前页面被推入栈中,当我们点击后退按钮时,栈顶的页面被弹出并显示在浏览器中。

2. 函数调用栈在编写程序时,函数的调用和返回也是通过栈来管理的。

每当一个函数被调用时,相关的信息(例如参数、返回地址等)会被推入栈中,当函数执行完毕后,这些信息会从栈中弹出,程序会回到函数调用的地方继续执行。

3. 括号匹配在编写编译器或表达式计算器时,需要检查括号是否正确匹配。

这个问题可以使用栈来解决。

遍历表达式时,遇到左括号将其推入栈中,遇到右括号时,若栈顶元素是对应的左括号,则将栈顶元素弹出,继续处理下一个字符;若栈为空或栈顶元素不是对应的左括号,则括号不匹配。

二、队列的应用1. 消息队列消息队列是一种在分布式系统中实现异步通信的机制。

它常用于解耦系统中的组件,例如,一个组件将消息发送到队列中,而另一个组件则从队列中接收消息并处理。

这种方式可以提高系统的可伸缩性和可靠性。

2. 打印队列在打印机系统中,多个任务需要按照先后顺序进行打印。

这时可以使用队列来管理打印任务的顺序。

每当一个任务到达时,将其加入到队列的末尾,打印机从队列的头部取出任务进行打印,直到队列为空。

3. 广度优先搜索广度优先搜索(BFS)是一种常用的图搜索算法,它使用队列来辅助实现。

在BFS中,首先将起始节点加入队列中,然后依次将与当前节点相邻且未访问过的节点入队,直到遍历完所有节点。

结论栈和队列作为常用的数据结构,在计算机科学中有着广泛的应用。

本文只介绍了它们部分的应用场景,实际上它们还可以用于解决其他许多问题,如迷宫路径搜索、计算器计算等。

因此,了解和熟练运用栈和队列是程序员和计算机科学家的基本素养之一。

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

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

实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验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<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。

栈和队列实验报告

栈和队列实验报告

栈和队列实验报告实验名称:栈和队列的实验研究摘要:本实验旨在通过设计并实现基于栈和队列的算法,探索其在数据结构和算法中的应用。

通过实验比较栈和队列的性能差异和适用场景,加深对栈和队列的理解和应用。

实验结果表明,栈和队列在不同的问题场景中具有不同的优势和适用性。

关键词:栈、队列、数据结构、算法、应用一、引言栈和队列是数据结构中常见且重要的两种数据结构,它们分别以LIFO(Last In First Out,后进先出)和FIFO(First In First Out,先进先出)的方式操作数据,广泛应用于各领域的编程和算法设计中。

本实验通过实现栈和队列相关操作的算法,探索它们在实际应用中的效率和优势。

二、实验设计与实现1.实验设计本实验采用C++语言来实现栈和队列的操作,并编写相应的算法来解决一些典型问题。

实验将比较栈和队列在以下几个方面的性能差异:a)插入操作的性能b)删除操作的性能c)查询操作的性能d)栈和队列的空间占用情况2.实验步骤a)设计栈的数据结构和相关操作的算法。

b)设计队列的数据结构和相关操作的算法。

c)分别使用栈和队列来解决一个典型问题,并比较它们的效率。

d)分析实验结果,总结栈和队列的适用场景和优势。

三、实验结果与分析1.栈的性能比较在本次实验中,我们使用栈来解决斐波那契数列问题。

首先,我们设计了一个栈的数据结构,并实现了如下操作:a) 入栈(push):将元素添加到栈顶。

b) 出栈(pop):将栈顶元素移出栈。

c) 查询栈顶元素(top):返回栈顶元素。

对比使用数组和链表实现栈的性能,我们发现使用链表实现的栈在插入和删除操作上有更好的性能表现,而使用数组实现的栈在查询操作上更高效。

这是因为使用链表实现的栈不需要移动大量元素,而使用数组实现的栈可以通过索引直接访问任意位置的元素。

2.队列的性能比较在本次实验中,我们使用队列来解决击鼓传花问题。

首先,我们设计了一个队列的数据结构,并实现了如下操作:a) 入队(enqueue):将元素添加到队列末尾。

实验报告(3)

实验报告(3)

数据结构上机实验报告实验三栈和队列班级:13级计本二班姓名:杨宴强学号:201392130129实验三栈和队列一、实验目的:⒈学习顺序栈的基本操作2.学习链栈的基本操作3.学习循环队列基本操作4.学习链队列基本操作二、实验内容:⒈顺序栈的基本运算2.链栈的基本操作3.循环队列的基本运算4.链队列的基本运算三、实验步骤及结果:1:顺序栈#include"stdio.h"#include"stdlib.h"#define MAXSIZE 20typedef struct{char data[MAXSIZE];//栈中元素存储空间int top;//栈顶指针}SeqStack;//顺序栈类型void Init_SeqStack(SeqStack **s)//顺序栈初始化{*s=(SeqStack*)malloc(sizeof(SeqStack));//在主函数中申请栈空间(*s)->top=-1;//置栈空标志}int Empty_SeqStack(SeqStack*s)//判断栈是否为空{if(s->top==-1)//栈为空时return 1;//返回1elsereturn 0;//返回0}void Push_SeqStack(SeqStack *s,char x)//顺序栈入栈{if(s->top==MAXSIZE-1)//判断是否栈满printf("Stack is full!\n");//栈已满else{s->top++;//s指向下个节点s->data[s->top]=x;//元素x压入栈*s中}}void Pop_SeqStack(SeqStack *s,char *x)//将栈*s中的栈顶元素出栈并通过参数x返回给主调函数{if(s->top==-1)//栈空返回1printf("Stack is empty!\n");//栈为空else{*x=s->data[s->top];//栈顶元素出栈s->top--;//栈顶指针top-1}}void Top_SeqStack(SeqStack *s,char *x)//取顺序栈栈顶元素{if(s->top==-1)//栈空返回1printf("Stack is empty!\n");//栈为空else{*x=s->data[s->top];//取栈顶元素值}}void print(SeqStack *s)//顺序栈输出{int i;//定义变量ifor(i=0;i<=s->top;i++)//判断printf("%4d",s->data[i]);//读入数据printf("\n");//输出栈}void main(){SeqStack *s;//定义指针schar x,*y=&x;//y是指向x的指针,出栈元素经过y传给变量xInit_SeqStack(&s);//顺序栈初始化if(Empty_SeqStack(s))//判断栈是否为空printf("Stack is empty!\n");printf("Input data of stack:\n");//顺序栈元素入栈scanf("%c",&x);//读入数据while(x!='\n')//对x的计数直到\n结束{Push_SeqStack(s,x);//x入栈scanf("%c",&x);}printf("Output all data of stack:\n");//提示print(s);//输出顺序栈中的元素Pop_SeqStack(s,y);//顺序栈元素出栈printf("Output data of Pop stack:%c\n",*y);//输出出栈元素printf("Output all data of stack:\n");print(s);//输出出栈后顺序栈中的元素Top_SeqStack(s,y);//读取顺序栈栈顶元素printf("Output data of top stack:%c\n",*y);//输出读出的栈顶元素printf("Output all data of stack:\n");print(s);//输出当前的顺序栈中的元素}2链栈#include<stdio.h>#include<stdlib.h>typedef struct node{char data;struct node*next;}StackNode;//链栈元素类型void Init_LinkStack(StackNode**s)//链栈初始化{*s=NULL;}int Empty_LinkStack(StackNode*s)//判断链栈是否为空{if(s==NULL)return 1;elsereturn 0;}void Push_LinkStack(StackNode**top,char x)//链栈元素入栈{StackNode*p;p=(StackNode*)malloc(sizeof(StackNode));//生成存储空间p->data=x;p->next=*top;//新生成的栈顶元素*p其后继为原栈顶元素**top *top=p;//栈顶指针*top指向新的栈顶元素*p}void Pop_LinkStack(StackNode**top,char*x)//链栈元素出栈{StackNode*p;if(*top==NULL)printf("Stack is empty!\n");//栈空else{*x=(*top)->data;//栈顶元素经指针x传给对应的变量p=*top;*top=(*top)->next;free(p);}}void print(StackNode*p)//链栈输出{while(p!=NULL){printf("%c,",p->data);p=p->next;}printf("\n");}void main(){StackNode*s;char x,*y=&x;//出栈元素经指针y传给xInit_LinkStack(&s);//链栈初始化if(Empty_LinkStack(s))//判断链栈是否为空printf("Stack is empty!\n");printf("Input any string:\n");//链栈元素入栈scanf("%c",&x);while(x!='\n'){Push_LinkStack(&s,x);scanf("%c",&x);}printf("Output string:\n");//链栈输出print(s);printf("Output stack:\n");Pop_LinkStack(&s,y); //链栈元素出栈printf("Element of Output stack is %c\n",*y);//输出出栈元素printf("Output string:\n");print(s);//链栈输出}3循环队列#include"stdio.h"#include"stdlib.h"#define MAXSIZE 20typedef struct{char data[MAXSIZE];//队头元素存储空间int rear,front;//队尾和队头指针}SeQueue;//顺序队列类型void Int_SeQueue(SeQueue**q)//置空队{*q=(SeQueue*)malloc(sizeof(SeQueue));//生成循环队列的存储空间(*q)->front=0;//队尾与队头指针相等则为队空(*q)->rear=0;}int Empty_SeQueue(SeQueue*q)//判队空{if(q->front==q->rear)//判断是否队空return 1;//队空elsereturn 0;//队不空}void In_SeQueue(SeQueue*q,char x)//元素入队{if((q->rear+1)%MAXSIZE==q->front)//判断是否队满printf("Queue is full!\n");//队满,入队失败else{q->rear=(q->rear+1)%MAXSIZE;//队尾指针加1q->data[q->rear]=x;//将元素X入队}}void Out_SeQueue(SeQueue*q,char*x)//元素出队{if(q->front==q->rear)//判断是否队空printf("Queue is empty");//队空,出队失败else{q->front=(q->front+1)%MAXSIZE;//队头指针加1*x=q->data[q->front];//队头元素出对并由x返回队头元素值}}void print(SeQueue*q)//循环队列输出{int i;//定义变量ii=(q->front+1)%MAXSIZE;//i入队while(i!=q->rear)//判断队空{printf("%4c\n",q->data[i]);//读入数据信息i=(i+1)%MAXSIZE;//逐步累加}printf("%4c\n",q->data[i]);//输出}void main(){SeQueue*q;//定义指针qchar x,*y=&x;//出对元素经指针y传给xInt_SeQueue(&q);//循环队列初始化if(Empty_SeQueue(q))//判队空printf("Queue is empty!\n");//提示printf("Input any string:\n");//给循环队列输入元素scanf("%c",&x);while(x!='\n'){In_SeQueue(q,x);//元素入队scanf("%c",&x);}printf("Output elements of Queue:\n");print(q);//循环队列输出printf("Output Queue:\n");Out_SeQueue(q,y);//循环队列元素出队printf("Element of Output Queue is %c\n",*y);//输出出队元素printf("Output elements of Queue:\n");print(q);//输出出队后的循环队列元素}4.链队列#include"stdio.h"#include"stdlib.h"#define MAXSIZE 30typedef struct node{char data;struct node *next;}QNode;//链队列结点类型typedef struct{QNode *front,*rear;//将头、尾指针纳入到一个结构体的链队列}LQueue;//链队列类型void Init_LQueue(LQueue **q)//创建一个带头结点的空队列{QNode *p;*q=(LQueue*)malloc(sizeof(LQueue));//申请带头、尾指针的结点p=(QNode*)malloc(sizeof(QNode));//申请链队列的头结点p->next=NULL;//头结点的next指针置为空(*q)->front=p;//队头指针指向头结点(*q)->rear=p;//队尾指针指向头结点}int Empty_LQueue(LQueue *q)//判队空{if(q->front==q->rear)return 1;//队为空elsereturn 0;}void In_LQueue(LQueue *q,char x)//入队{QNode *p;p=(QNode*)malloc(sizeof(QNode));//申请新链队列结点p->data=x;p->next=NULL;//新结点作为队尾结点时其next域为空q->rear->next=p;//将新结点*p链到原队尾结点之后q->rear=p;//是队尾指针指向新的队尾结点*p}void Out_LQueue(LQueue *q,char *x)//出队{QNode *p;if(Empty_LQueue(q))printf("Queue is empty!\n");//队空,出队失败else{p=q->front->next;//指针p指向队头结点q->front->next=p->next;//头结点的next指针指向链队列的第二个数据结点*x=p->data;//将删除的队头结点数据经由指针x返回free(p);if(q->front->next==NULL)//出队后队为空,则置为空队列q->rear=q->front;}}void print(LQueue *q)//链队列输出{QNode *p;p=q->front->next;while(p!=NULL){printf("%4c",p->data);p=p->next;}printf("\n");}void main(){LQueue *q;char x,*y=&x;//出队元素经指针y传给xInit_LQueue(&q);//链队列初始化if(Empty_LQueue(q))//判队空printf("Queue is empty!\n");printf("Input any string:\n");//给链队列输入元素scanf("%c",&x);while(x!='\n'){In_LQueue(q,x);scanf("%c",&x);//元素入队}printf("Output elements of Queue:\n");print(q);//链队列输出printf("Output Queue:\n");Out_LQueue(q,y);//元素出队printf("Element of Output Queue is %c\n",*y);//输出出队的元素值printf("Output elements of Queue:\n");print(q);//输出出队后链队列的元素}四、实验总结:通过本次试验,了解了栈和队列的基本操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名学号void print(void);int main(void){system("title 数据结构实验实验三:栈和队列及其应用(I) "); //设置cmd窗口标题system("color F1"); //设置控制台窗口的背景色和前景色system("date /T"); //输出当前的日期print();cout << "实验内容一:采用顺序存储结构,实现栈的存储和基本操作" << endl;SqStack S;SElemType e;InitStack_Sq(S); //构造一个空栈Sint count;cout << "请输入需入栈的元素个数:N = ";cin >> count;cout << "请输入元素:";for (int i = 0; i < count; i++){cin >> e;Push_Sq(S, e);}GetTop_Sq(S, e);cout << " 栈顶元素:" << e << endl;cout << " 出栈:";while ((Pop_Sq(S, e)))cout << e << " ";cout << endl << "栈的应用:" << endl << "1.将十进制数转换为二进制数" << endl;DecToBin(); //将十进制数转换为二进制数cout << "2.汉罗塔问题" << endl << " 请输入圆盘个数:";int n; //圆盘个数char x = 'A', y = 'B', z = 'C';cin >> n;cout << "圆盘移动步骤:";Hanoi(n, x, y, z);DestoryStack_Sq(S); //销毁栈Scout << endl;print();cout << "实验内容二:采用顺序存储结构,实现队列的存储和基本操作" << endl;SqQueue Q;QElemType data;InitQueue_Sq(Q); //构造一个空队列Qcout << "请输入需入队列的元素个数:N = ";cin >> count;cout << "请输入元素:";for (int i = 0; i < count; i++){cin >> data;EnQueue_Sq(Q, data);}GetHead_Sq(Q, data);cout << " 队首元素:" << data << endl;cout << " 出队列:";while (DeQueue_Sq(Q, data))cout << data << " ";cout << endl;print();cout << endl;}void print(void){cout << endl <<"***********************************************************" << endl; }2.头文件”ADT.h”的部分程序如下:#ifndef ADT_H_#define ADT_H_/************************************************************* 常量和数据类型预定义************************************************************//* ------函数结果状态代码------ */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2/* ------数据类型预定义------ */typedef int Status; //函数结果状态类型typedef int _bool; //bool状态类型/************************************************************* 数据结构类型定义************************************************************//************************栈和队列*************************//* ------栈数据类型定义------ */typedef int SElemType; //顺序表中元素的数据类型/* ------栈动态存储分配初始常量预定义------ */#define STACK_INIT_SIZE 100 //栈表存储空间的初始分配量#define STACKINCREMENT 10 //栈表存储空间的分配增量/* ------顺序栈结构类型定义------ */typedef struct{SElemType * base; //栈底指针SElemType * top; //栈顶指针int stacksize; //当前以分配的存储空间}SqStack; //顺序栈结构类型/* ------队列数据类型定义------ */typedef int QElemType; //顺序表中元素的数据类型/* ------队列动态存储分配初始常量预定义------ */#define QUEUE_INIT_SIZE 100 //队列存储空间的初始分配量#define QUEUEINCREMENT 10 //队列存储空间的分配增量#define MAXQUEUESIZE 100 //循环队列最大长度/* ------队列顺序存储结构类型定义------ */typedef struct{QElemType *base; //队列初始化动态分配存储空间int front; //对头指针向量,队列不空,指向队头元素int rear; //队尾指针向量,队列不空,指向队尾下一个位置}SqQueue; //顺序队列结构类型#endif /* ADT_H_ */3.头文件"DataStructure_StackQueue.h"中部分函数定义如下:#include <stdio.h>#include <malloc.h>#include "ADT.h"/************************************************************* 功能函数声明区************************************************************//* ---------栈--------- *///栈的基本操作Status InitStack_Sq(SqStack &S); //构造一个空顺序栈SStatus GetTop_Sq(SqStack &S, SElemType &e); //返回栈顶元素eStatus StackEmpty_Sq(SqStack &S); //判断栈S是否为空Status DestoryStack_Sq(SqStack &S); //销毁顺序栈SStatus Push_Sq(SqStack &S, SElemType e); //元素e压入顺序栈Status Pop_Sq(SqStack &S, SElemType &e); //元素e出栈//栈的应用Status DecToBin(void); //十进制数转换为二进制数void Hanoi(int n, char x, char y, char z); //实现Hanoi问题,借助y塔将x塔上的n个圆盘搬移到z塔上/* ---------队列--------- *///队列的基本操作Status InitQueue_Sq(SqQueue &Q); //构造一个空的顺序队列Q Status GetHead_Sq(SqQueue &Q, QElemType &e); //返回顺序队列的队头元素e Status EnQueue_Sq(SqQueue &Q, QElemType e); //将元素e插入到队列Q中Status DeQueue_Sq(SqQueue &Q, QElemType &e); //将元素e从顺序队列中删除并返回Status InverseQueue_Sq(SqQueue &Q); //实现队列的逆置/************************************************************* 功能函数定义区************************************************************//***************栈结构函数定义****************//** 函数原型:Status InitStack_Sq(SqStack &S)* 函数功能:构造一个空栈S* 入口参数:SqStack类型的结构体变量S的引用&S* 出口参数:返回函数结果状态*/Status InitStack_Sq(SqStack &S){S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base)return(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;} //InitStack_Sq/** 函数原型:Status DestoryStack_Sq(SqStack &S)* 函数功能:销毁栈S* 入口参数:SqStack类型的结构体变量S的引用&S* 出口参数:返回函数结果状态*/Status DestoryStack_Sq(SqStack &S){SElemType *p;while (S.base != S.top){p = --S.top;free(p);}return OK;} //DestoryStack_Sq/** 函数原型:Status Push_Sq(SqStack &S, SElemType e)* 函数功能:将元素e入栈* 入口参数:SqStack类型的结构体变量S的引用&S,SElemType类型元素e* 出口参数:返回函数结果状态*/Status Push_Sq(SqStack &S, SElemType e){SElemType *newbase;if (S.top - S.base >= S.stacksize){newbase = (SElemType *)realloc(S.base, (STACKINCREMENT +S.stacksize)*sizeof(SElemType));if (!newbase)return OVERFLOW;S.base = newbase;S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;} //Push_Sq/** 函数原型:Status Pop_Sq(SqStack &S, SElemType &e)* 函数功能:将元素e出栈* 入口参数:SqStack类型的结构体变量S的引用&S,SElemType类型元素e的引用&e * 出口参数:返回函数结果状态*/Status Pop_Sq(SqStack &S, SElemType &e){if (S.top == S.base)return ERROR;e = * --S.top;return OK;} //Pop_Sq/** 函数原型:Status DecToBin(void)* 函数功能:将十进制数转换为二进制* 入口参数:void* 出口参数:返回函数结果状态*/Status DecToBin(void){LinkStack S;SElemType e;long data;printf(" 请输入待转换的十进制数:");scanf_s("%d", &data);InitStack_L(S);while (data){Push_L(S, data % 2);data = data / 2;}printf(" 转换后的二进制数:");while (S->next){Pop_L(S, e);printf("%d", e);}printf("\n");return OK;} //DecToBin/***************队列结构函数定义****************//** 函数原型:Status InitQueue_Sq(SqQueue &Q)* 函数功能:构造一个空队列Q* 入口参数:SqQueue类型的结构体变量Q的引用 &Q* 出口参数:返回函数结果状态*/Status InitQueue_Sq(SqQueue &Q){Q.base = (QElemType *)malloc(QUEUE_INIT_SIZE * sizeof(QElemType));if (!Q.base)return(OVERFLOW);Q.front = Q.rear = 0;return OK;} //InitQueue_Sq/** 函数原型:Status GetHead_Sq(SqQueue &Q, QElemType &e)* 函数功能:若队列不空,则返回队头元素e,并返回函数结果状态OK,否则返回ERROR * 入口参数:SqQueue类型的结构体变量Q的引用&Q,QElemType类型元素e的引用&e * 出口参数:返回函数结果状态*/Status GetHead_Sq(SqQueue &Q, QElemType &e){if (Q.front == Q.rear)return ERROR;e = Q.base[Q.rear - 1]; //队尾指针向量指向下一个元素return OK;} //GetHead_Sq/** 函数原型:Status EnQueue_Sq(SqQueue &Q, QElemType e)* 函数功能:将元素e插入到队列Q中* 入口参数:SqQueue类型的结构体变量Q的引用&Q,QElemType类型元素e* 出口参数:返回函数结果状态*/Status EnQueue_Sq(SqQueue &Q, QElemType e){QElemType *newbase;if (Q.front - Q.rear >= QUEUE_INIT_SIZE){newbase = (QElemType *)realloc(Q.base, (STACKINCREMENT +QUEUE_INIT_SIZE)*sizeof(QElemType));if (!newbase)return OVERFLOW;Q.base = newbase;}Q.base[Q.rear++] = e;return OK;} //EnQueue_Sq/** 函数原型:Status DeQueue_Sq(SqQueue &S, QElemType &e)* 函数功能:将元素e从队列中删除并返回Welcome !!! 欢迎您的下载,资料仅供参考!。

相关文档
最新文档