【数据结构实验】队列的应用

1.实验目的:

熟悉队列的定义,队列的特点以及队列的基本操作。能够根据实际情况选择合适的存储结构,解决实际问题。

2.实验内容:

利用循环队列模拟舞伴配对问题:

1、利用循环队列模拟舞伴配对问题。在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。

2、假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。

试模拟解决上述舞伴配对问题。

3、从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。

3.正文部分

①什么是队列

队列是逻辑上一维的线性数据结构。所以在队列的代码实现中,很自然采用一维数组来存储队列的元素。

队列是一种先进先出(First In First Out,FIFO)的线性表,它只允许在一端(队尾)执行插入操作,而在另一端(队头)执行删除操作。

由于队列的实际操作中发生频繁的进队和出队操作,需要设立队首head和队尾tail两个变量。

head用于指示队首元素所在的位置,也就是队首元素在数组的位置下标,tail用于指示队尾元素所在的位置,也就是队尾元素在数组的位置下标。

然而实际上,tail是指示队尾元素所在位置的“下一个”位置,也就是下一个进队元素的放置位置。

这样做的好处有三个:

  1. 方便计算队内有多少个元素(tail-head)
  2. 方便判断队列是否为空(当head==tail时,队列为空)
  3. 在简单队列或者循环队列中都可以判断队列是否为满。
②简单队列的代码实现

简单队列,适用于“一次性队列”的场合。

优点:简洁 缺点:不通用

#include<iostream>
using namespace std;
const int MAXX = 5;//设定队列的大小

int quee[MAXX];//定义一个元素为整数类型的队列
int head;//队首元素所在位置
int tail;//队尾元素所在的位置

//初始化队列quee
void init()
{
    head = tail = 0;
}
//判断队列是否已满
bool isFull()
{
    //tail到了数组末尾
    if (tail >= MAXX) return true;
    else return false;
}
//判断队列是否为空
bool isEmpty()
{
    if (head == tail) return true;
    return false;
}
//进队 操作成功返回true 操作失败返回false
bool push(int x)
{
    if (isFull()) return false;
    quee[tail++] = x;//x加入队列后tail往后一个元素
    return true;
}
//读取队头元素  操作成功返回true 操作失败返回false
bool getFront(int& v)
{
    if (isEmpty()) return false;
    v = quee[head];
    return true;
}
//出队
void pop()
{
    if (isEmpty()) return;//队列为空 停止操作
    head++;//让head的下一个元素变为队首元素
}
int main()//一个例子
{
    //初始化队列
    init();
    //进队
    push(1);
    push(2);
    push(3);
    //输出队列中的每一个元素
    int x;
    while (!isEmpty())
    {
        getFront(x);
        cout << x << " ";
        pop();
    }
    return 0;
}

③循环队列的代码实现

与简单队列很相似,循环队列也是用一个一维数组来存储队列的元素。

取模运算是循环队列的特色,它使得当tail+1等于MAXX时,可以重新变为0,让下一个进队的元素从数组“前面”部分开始存放,从而实现循环的效果。

#include<cstdio>
using namespace std;
const int MAXX=6;
int quee[MAXX];
int head,tail;
//初始化
void init()
{
    head=tail=0;
}
//判断队列是否满
bool isFull()
{
    //如果tail的下一个位置与head相同的话
    //以此可以区分队列为空的情况
    //取模运算 循环队列特色
    if((tail+1)%MAXX==head) return true;
    else return false;
}
bool push(int v)
{
    if(isFull()) return false;
    quee[tail]=v;
    tail=(tail+1)%MAXX;//当tail+1等于MAXX时,可以重新变为0
    return true;
}
bool isEmpty()
{
    if(tail==head) return true;
    else return false;
}
//出队  队列不空则删除队首元素x
bool pop()
{
    if(isEmpty()) return false;
    head=(head+1)%MAXX;
    return true;
}
//读取队头元素
bool getFront(int &v)
{
    if(isEmpty()) return false;
    v=quee[head];
    return true;
}
//求队列元素个数
int getSize()
{
    return (tail-head+MAXX)%MAXX;//可能出现tail在head前面的情况 为了防止计算出负数,所以取模前加上MAXX
}
//依次输出队列的元素
void output()
{
    for(int i=head;i!=tail;i=(i+1)%MAXX)
        printf("%d",quee[i]);
    printf("\n");
}
int main()//
{
    //
}
④本题代码

完整源码下载:数据结构——队列的应用

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AKA山风点火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值