队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。---------- 百度百科
STL是Standard Template Library的简称,中文名标准模板库。
队列的STL语句:
在c++中queue也有一个标准模板库,必须要使用<queue>头文件。
定义一个队列:
queue<int> a ;// < >中为队列的的类型。
一下为STL中的规定语句,以及用法:
s.size(); // 返回s队列里元素的个数,有返回值 。
s.empty(); // 返回s队列是否为空,空则返回1,不空就返回0,又返回值。
s.push(a); // 将元素a从队尾放入,没有返回值 。
s.pop(); // 删除队首元素,没有返回值 。
s.front(); // 返回队首元素(最早进入队列的元素),但是不删除 。
s.back(); // 返回队尾元素(最晚进入队列的元素),但是不删除 。
下面找了一道题来看看。
一边做题,一边慢慢的学会应用队列的STL语句。
题面: —— 水题。但有助于理解队列的STL用法!!!
任务调度
(schedule.cpp/c/pas)
Time Limit : 1 sec , Memory Limit : 131072 KB
Description
队列中有 n 个进程。
每个进程都有名称: namei 和 处理时间:timei。
CPU通过循环调度按顺序处理这些进程。
循环调度程序为每个进程提供确定的时间片,如果该进程未在时间片内执行完成,那么该进程就会被中断。
然后该进程将被恢复并移动到队列的末尾,然后调度程序随即开始处理队列中的下一个进程。
例如,有以下的进程任务队列,其时间片为 100ms。
A(150) - B(80) - C(200) - D(200) 首先,进程 A 被处理 100 毫秒,然后CPU将进程A中断,进程A带着剩余的50毫秒移动到队列的末尾。
B(80) - C(200) - D(200) - A(50) 接下来,进程 B 被处理 80 毫秒,即在总计第 180 毫秒时处理完毕, 进程B并从队列中删除。
C(200) - D(200) - A(50) 你的任务是编写一个程序,模拟循环调度。
Input
n q
name1 time1
name2 time2
...
name n time n
在第一行中,进程数 n 和时间片 q 以单个空格分隔。
在以下 n 行中,给出了 n 个进程的名称和处理时间。
namei 和 timei 由单个空格分隔。
Output
对于每个进程,按完成的先后顺序打印其名称和结束时间。
Constraints
1 ≤ n ≤ 100000
1 ≤ q ≤ 1000
1 ≤ timei ≤ 50000
1 ≤ length of namei ≤ 10
1 ≤ Sum of timei ≤ 1000000
Sample Input
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
Sample Output
p2 180
p5 400
p1 450
p3 550
p4 800
分析:
读完本题,就会想到队列这种数据结构:头进尾出,简单方便。
所以不得不用到队列来解决这个问题。
题解(STL):这里就用了STL大法,非常简单!!!
#include <iostream>
#include <cstdio>
#include <queue> //用STL维护队列,千万不要忘记头文件!!!
using namespace std ;
int main ()
{
queue<int> s ; //定义一个整形队列来储存时间。
queue<string> d ; //定义一个字符串类型来储存名字。
int n , q , Time = 0 ;
int b ;
string a ;
scanf ( "%d %d" ,& n ,& q ) ;
for ( int i = 0 ; i < n ; i ++ )
{
cin>>a>>b ;
s.push( b ) ;
d.push( a ) ; //STL大法直接入队。
}
while ( ! s.empty() ) //出队列知道空为止。
{
if ( s.front() > q )
{
s.push( s.front() - q ) ;
s.pop() ;
d.push( d.front() ) ;
d.pop() ; //用一个删一个。
Time += q ;
}
else
{
b = s.front() ;
Time += s.front() ;
cout<<d.front()<<" "<<Time<<endl ;
s.pop() ;
d.pop() ;//输出了也要记得删除,不然会一直循环!!!
}
}
return 0 ;
}
以上即为STL大法,轻松的A掉了一道题。