【C++】STL队列和栈的使用

C++的STL标准模板库提供了队列和栈的基本操作。下面通过两个demo分别介绍STL队列和STL栈的使用。

Demo1:STL队列

【题目】卡片游戏(题目来自刘汝佳《算法竞赛入门》)

桌上又一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n。当至少还剩两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。

样例输入:7

样例输出:1 3 5 7 4 2 6

【分析】这些牌就是一个先进先出(FIFO)的队列,每次对排头的两张进行操作,第一张出队列,第二张放到队尾。

【代码】

#include<cstdio>
#include<queue>
using namespace std;

int main()
{
	queue<int> q;
	int n;
	scanf("%d",&n);
	for(int i = 0;i < n;i++)
	{
		q.push(i+1);
	}
	while(q.size()>=2)
	{
		printf("%d\t",q.front());//输出需要队头第一张,并出队列
		q.pop();
		q.push(q.front());//将队头第二张放到队尾
		q.pop();
	}
	printf("%d\n",q.front());//输出剩余的最后一张
	return 0;
}

Demo2:STL堆栈

【题目】铁轨(题目来自刘汝佳《算法竞赛入门》)

某城市有一个火车站铁轨铺设如图,有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站。但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了,一旦C移入B,就不能回到C了,换句话说,在任意时刻,只有两种选择:A->C,C->B。

样例输入:

5

1 2 3 4 5

5

5 4 1 2 3

6

6 5 4 3 2 1

样例输出:

Yes

No

Yes

【分析】A、B车站为队列,C站位LIFO栈。将A车站队列初始化为1~n,B车站队列初始化为用户输入的顺序,进行以下循环,直到B队列为空:

1.如果A车站的队头和B车站的队头相等,直接将A车站对头列车开到B车站(A、B队列均进行出队列操作)。

2.否则如果C栈顶元素和B队头元素相等,则将C的栈顶列车驶入B(C出栈操作,B出队列操作)。

3.否则如果A队列不为空,将A队列队头元素入C栈,

4.否则标记不成功,跳出循环。

【代码】

#include <cstdio>
#include <stack>
#include <queue>
using namespace std;

int main()
{
	int n,temp;
	while(scanf("%d",&n)==1)
	{
		stack<int> c;
		queue<int> a,b;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&temp);
			a.push(i);
			b.push(temp);
		}

		int ok=1;
		while(b.size()!=0)
		{
			if(a.size()!=0&&a.front()==b.front())
			{a.pop();b.pop();}
			else if(c.size()!=0 && b.front()==c.top())
			{b.pop();c.pop();}
			else if(a.size()!=0)
			{c.push(a.front());a.pop();}
			else
			{ok=0;break;}
		}
		if(ok)
			printf("Yes");
		else
			printf("No");
	}
	return 0;
}
时间: 2024-11-08 18:59:14

【C++】STL队列和栈的使用的相关文章

STL的队列和栈简单使用

STL的队列和栈简单使用 #include <iostream>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <stack>using namespace std;int main(){ queue<int> Q; stack<int> S; int i; for(i=1;i<=10;i++

STL 队列 、优先队列、栈 小结

学长说现在基本上可以开始学习STL中一些标准模板了,今天先总结一下 队列.栈.优先队列 1.队列(queue) 先进先出原则,头文件#include <queue>,定义结构queue<类型>名称;queue<int>q.queue<node>q等: 如: struct node { int x; }f; queue<node>q;//结构体类型队列 q.push(f) //将f压入队列的尾部 node t = q.pop()// 弹出队列的第一

STL队列、优先队列、栈

STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队.在默认的int型中先出队的为较大的数. 使用方法: 头文件: #include <queue> 声明方式: 1.普通方法: priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

数据结构与算法之队列、栈

除了数组.链表,线性的数据结构中还有很重要的几种结构:队列.栈. 队列,一种先进先出的数据结构(FIFO),其实队列可以看成是一个两个口的管道,从一个口进,另一个口出,先进去的必定得在另一个口先出去,否则后面的都出不去:栈,一种后进先出的数据结构(LIFO),栈更像是只有一个口的管道,只有一个开口可以进出,先进去的在底部,所以必须得让后进去的先出去,它才能出去. 实现队列和栈可以用顺序存储结构,也可以用链式存储结构.这里采用的是链表来实现,同时还有用两个栈实现一个队列和用两个队列实现一个栈的算法

c++ STL:队列queue、优先队列priority queue 的使用

说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6.size() 返回队列中元素的个数

单调队列 单调栈

建议不了解STL的读者先了解几个基本的队列的STL.这也是单调队列和单调栈一般都会用到的. 单调队列:建立一个队列,使队列一直具有单调性(满足单调递增或者单调递减),时间复杂度O(N). 那么我们应该如何做到"使队列一直具有单调性"呢? 以单调递增为例,我们O(N)扫描整个序列,每扫描到一个元素: 1 如果该元素大于等于队列末尾元素,则直接入队; 2 而如果该元素小于已有队列的末尾元素,即不满足单调递增,则使队列中的末尾元素出队,直到该元素符合入队条件,然后入队. 如果只到这里,那么我

编程题目: 两个队列实现栈(Python)

感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 队列2 都为空的时候,那就选择入队到队列1. 3.出队操作:当两个队列都为空的时候,引发错误"栈为空": 当队列2位空的时候,如果队列1中只有一个元素,则直接将队列1中的元素出队: 如果队列1不止一个元素的时候,就将队列1的元素出队然后入队到队列2,知道队列1中只有一个元素,然后将队列1

C语言算法系列---1.队列和栈

写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了.这些东西不见得多高深,也可能很简单,但很基础,也无法忽视.同时,也是自己学习走过的一条路. 这是开头,就写写C的队列和栈的一些算法吧. 首先是栈的一些基础功能的实现,先贴代码: #include<stdlib.h> #include<stdio.h> typedef int SElemType; //声明栈元素类型为int typedef int Status; //函数返回值的类型为int #def