数据结构:队列

  例题:POJ - 2259  (http://poj.org/problem?id=2259

  题目大意:在队伍中,一个元素要入队,先会看看队伍中有没有跟它同队的队友,如果有,它会直接插在队友的后面,如果没有,那就插在整个队伍后面。出队时,整个队伍从头到尾出列。就好像我们平时排队一样,先看看队里有没有熟人,有熟人就排在熟人后面,没有熟人就自己乖乖的排在队伍的尾部。

  思路:如果只用一个队列,那么入队时候的操作很复杂。所以,我们为每一支队伍(“熟人”)都开一个队列,然后再用一个队列来保存队伍的编号,用一个数组m[]表示元素与队伍号的关系,用一个数组f[]表示有无同队元素。(PS:运用C++的STL吧!非常方便!都不用自己写啦!~)

  代码:http://paste.ubuntu.com/16316998/

 1 #include <iostream>
 2 #include <string>
 3 #include <queue>
 4 using namespace std;
 5 int casenum,num,eNum,elem;
 6 queue<int>    que[1001];        //每个队列的元素
 7 queue<int>    qnum;            //队列编号
 8 int m[1000000];                //元素和队列号的映射
 9 int f[1001];                //有无同队元素
10
11 void solve()
12 {
13     string com;
14     int e;
15     cout<<"Scenario #"<<++casenum<<endl;
16     while(cin>>com && com != "STOP")
17     {
18         if(com == "ENQUEUE")
19         {
20             cin>>e;
21             if(!f[m[e]])
22             {
23                 f[m[e]] = 1;
24                 qnum.push(m[e]);
25             }
26             que[m[e]].push(e);
27         }
28         else
29         {
30             int nq = qnum.front();
31             cout<<que[nq].front()<<endl;
32             que[nq].pop();
33             if(que[nq].empty())
34             {
35                 qnum.pop();
36                 f[nq] = 0;
37             }
38         }
39     }
40     cout<<endl;
41 }
42 void init()                    //初始化
43 {
44     for(int i=0;i<num;i++)
45     {
46         f[i] = 0;
47         while(!que[i].empty())    que[i].pop();
48     }
49     while(!qnum.empty())    qnum.pop();
50 }
51 int main()
52 {
53     int i,j;
54     casenum = 0;
55     while(cin>>num && num)
56     {
57         init();
58         for(i=0;i<num;i++)
59         {
60             cin>>eNum;
61             for(j=0;j<eNum;j++)
62             {
63                 cin>>elem;
64                 m[elem] = i;
65             }
66         }
67         solve();
68     }
69 }
时间: 2024-08-10 23:28:06

数据结构:队列的相关文章

基本数据结构-队列的实现及其运用

二.队列 队列是一种先进先出的数据结构,元素只能添加到队尾,而对元素的删除,修改,检索只能在队头进行.与栈的差异是很明显的.同样队列的实现可以基于链表,也可以基于数组.和栈的基本操作差不多,但队列多了一个指针(标号)指向末尾的元素,因为需要在末尾插入元素. 1.队列的链表实现 #ifndef QUEUE_H #define QUEUE_H #include <iostream> template <class T> class queue { public: queue(); ~q

数据结构—队列

数据结构-队列 1.队列的定义 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许插入的一端称为队尾(rear),允许删除的一端称为队头 (Front) 队列模型 2.队列的操作 队列的操作原则是先进先出的,所以队列又称作FIFO表(First in First out) 置空队:InitQueue(Q) 判队空:QueueEmpty(Q) 判队满:QueueFull(Q) 入队:En

java数据结构队列

队列类似于现实生活中的排队.队列是先进先出的原则,只允许在队列头部去除元素,队列尾部添加元素. 下面是分别用数组和链表为存储结构实现的队列 public interface Queue<T> { int size(); T remove(); void add(T element); boolean isEmpty(); void clear(); boolean hasElement(); } public class ArrayQueue<T> implements Queue

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

数据结构--队列之C数组实现

队列是一种限定操作的线性表,它只能在表的一段插入,另外一段取出. 所以也称为先进先出数据结构(FIFO---First In First Out) C代码如下(有小bug不想调了,作为参考即可): #include<stdio.h> #define maxsize 5 typedef int ElemType; typedef struct queue { int head; int tail; ElemType Data[maxsize]; }Queue; void InitQueue(Qu

java 数据结构 队列的实现

java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java.util.*; public class Queue{ Node tail = new Node(); Node nowNode = new Node(); //永远指向队首 int size; Queue(){}; Queue(String date){ this.tail.date = dat

数据结构队列实例

1 //数据结构 --队列 2 //静态队列-用数组实现 3 //静态队列通常是循环队列 4 //循环队列讲解 5 //1.静态队列为什么必须是循环队列? 6 //2.循环队列需要几个参数来确定? 7 /* 8 front 和 rear 9 1)队列初始化,font和rear的值都为零 10 2)队列非空 11 font代表的是队列的第一个元素 12 rear代表的是队列的最后一个有效元素的下一个元素 13 3)队列空 14 front和rear值 15 */ 16 //3.循环队列各个参数的含

JavaScript数据结构——队列的实现

前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 队列的两种主要操作是:向队列中插入新元素和删除队列中的元素.插入操作也叫做入队,删除操作也叫做出队.入队操

数据结构-队列_习题

<实用数据结构> 第4章 6.1题 //算法设计题.要求:设一个循环队列Queue,只有头指针front,不设尾指针,另设一个含有元素个数的记录器count, //试写出相应的入队和出队的算法 #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; #define MAXLEN 10 #define Status int #define datatype i

数据结构——队列及循环队列

说明:严蔚敏的<数据结构>(C语言版)学习笔记,记录一下,以备后面查看. #include <stdio.h> #include <stdlib.h> #define OK 1; #define ERROR -1; typedef int QElemType; typedef int Status; //定义队列节点 typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr;