Loading

7.2队列的应用

一、基本定义

队列是一种先进先出的数据结构,就如同食堂打饭最先来的人最先打饭出队。

一般都有一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素

当使用数组来实现的时候,初始状态为front=-1,rear=-1,类型为int型变量。

链表实现的时候同理也是首指针指向队首元素的前一个位置,队尾指针rear来指向队尾元素,类型为int* 型变量。

二、STL库的queue用法

queue<typename>name;
q.push(i);        //将i压入队列之中
q.front();        //获得队首元素
q.back();        //和队尾元素
q.pop();        //令队首元素出队
q.empty();        //检测队列是否为空
q.size();        //返回队列的大小

使用pop和front与back要在队列非空的情况下才能使用

while(!q.empty()){
    q.pop();
}

三、实现程序

数组

typedef int Position;
struct QNode {
    ElementType *Data;     /* 存储元素的数组 */
    Position Front, Rear;  /* 队列的头、尾指针 */
    int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode *Queue;
 
Queue CreateQueue( int MaxSize )
{
    Queue Q = (Queue)malloc(sizeof(struct QNode));
    Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
    Q->Front = Q->Rear = 0;
    Q->MaxSize = MaxSize;
    return Q;
}
 
bool IsFull( Queue Q )
{
    return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}
 
bool AddQ( Queue Q, ElementType X )
{
    if ( IsFull(Q) ) {
        printf("队列满");
        return false;
    }
    else {
        Q->Rear = (Q->Rear+1)%Q->MaxSize;
        Q->Data[Q->Rear] = X;
        return true;
    }
}
 
bool IsEmpty( Queue Q )
{
    return (Q->Front == Q->Rear);
}
 
ElementType DeleteQ( Queue Q )
{
    if ( IsEmpty(Q) ) { 
        printf("队列空");
        return ERROR;
    }
    else  {
        Q->Front =(Q->Front+1)%Q->MaxSize;
        return  Q->Data[Q->Front];
    }
}

链表 

typedef struct Node *PtrToNode;
struct Node { /* 队列中的结点 */
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode Position;
 
struct QNode {
    Position Front, Rear;  /* 队列的头、尾指针 */
    int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode *Queue;
 
bool IsEmpty( Queue Q )
{
    return ( Q->Front == NULL);
}
 
ElementType DeleteQ( Queue Q )
{
    Position FrontCell; 
    ElementType FrontElem;
     
    if  ( IsEmpty(Q) ) {
        printf("队列空");
        return ERROR;
    }
    else {
        FrontCell = Q->Front;
        if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
            Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
        else                     
            Q->Front = Q->Front->Next;
        FrontElem = FrontCell->Data;
 
        free( FrontCell );  /* 释放被删除结点空间  */
        return  FrontElem;
    }
}

四、PAT 1056

#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1010;
struct mouse{   //老鼠
    int weight;     //质量
    int R;     //排名
}mouse[maxn];
int main()
{
    int np,ng,order;
    scanf("%d%d",&np,&ng);      //np就是老鼠的数量,ng就是一组的个数
    for(int i=0;i<np;i++)
    {
        scanf("%d",&mouse[i].weight);
    }
    queue<int>q;        //定义一个队列
    for(int i=0;i<np;i++)
    {
        scanf("%d",&order);     //题目给出的顺序
        q.push(order);      //按顺序把老鼠们的标号入队
    }
    int temp=np,group;      //temp为当前轮的比赛总老鼠数,group为组数
    while(q.size()!=1){
        //计算group,即当前轮分为几组进行比赛
        if(temp%ng==0) group=temp/ng;
        else group=temp/ng+1;
        //枚举每一组,选出该组老鼠中质量最大的
        for(int i=0;i<group;i++)
        {
            int k=q.front();        //k存放该组质量最大的老鼠编号
            for(int j=0;j<ng;j++)
            {
                //在最后一组老鼠数不足NG时起作用,退出循环
                if(i*ng+j>=temp)break;
                int front=q.front();        //队首老鼠的编号
                if(mouse[front].weight>mouse[k].weight)
                {
                    k=front;        //找出质量最大的老鼠
                }
                mouse[front].R=group+1;     //该轮老鼠的排名为group+1
                q.pop();        //出队这只老鼠
            }
            q.push(k);      //把胜利的老鼠晋级
        }
        temp=group;     //group只老鼠晋级,因此下轮总老鼠数为group
    }
    mouse[q.front()].R=1;       //当前队列中只剩1只老鼠时,令其排名为1
    //输出所有老鼠的信息
    for(int i=0;i<np;i++)
    {
        printf("%d",mouse[i].R);
        if(i<np-1)printf(" ");
    }
    return 0;
}

 

posted @ 2019-10-07 19:00  kopoo  阅读(85)  评论(0)    收藏  举报