STL-queue

队列(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掉了一道题。

posted @ 2019-07-22 20:14  yhz_Albert  阅读(172)  评论(0编辑  收藏  举报