STL.deque(双向队列)只能从头部和尾部插入和删除元素(可实现stack和queue)

标签: STL(他山之石,可以攻玉)
21人阅读 评论(0) 收藏 举报
分类:

/*

STL:

vector(动态数组)只能从尾部追加和删除元素

deque(双向队列)只能从头部和尾部插入和删除元素(可实现stack和queue)

list(双向链表)从任何地方插入和删除元素

set和map都是以红黑树(二叉搜索树)的方式实现的

*/

#include <deque>
#include <stack>  
#include <list>//stack<int, list<int>> SL;
#include <vector>//stack<int, vector<int>> SV;
#include <queue>
#include <cstdio>
#include<algorithm>
#include<iostream>
#include<iomanip>
using namespace std;

/*
双向队列deque是一种双向开口的连续线性空间,
可以高效的在头尾两端插入和删除元素,
deque在接口上和vector非常相似,
下面列出deque的常用成员函数
*/


void DequeTest()
{
	deque<int> IntDeque(20);//创建一个int类型的双向队列,初始有20个元素,默认值为0
	for(int i  =0 ; i < 20; i++){
		IntDeque[i] = i+1;
	}
	cout << "双向队列中所有的元素如下:" << endl;
	for(int i = 0; i < 20; i++){
		cout << setw(3) << IntDeque[i];
	}
	
	cout << endl << "在头尾加入新数据..." << endl;
	IntDeque.push_back(21);
	IntDeque.push_front(0);
	cout << "双向队列中所有的元素如下:" << endl;
	for(auto it = IntDeque.begin(); it != IntDeque.end(); it++){
		cout << setw(3) << *it;
	}
	cout << endl;


	//查找
	deque<int>::iterator pos = find(IntDeque.begin() , IntDeque.end(), 19);
	if(pos != IntDeque.end())					cout << "find(19) successfully !" << endl;
	else														cout << "failed to find(19) !" << endl;	
	pos = find(IntDeque.begin() , IntDeque.end(), 33);
	if(pos != IntDeque.end())					cout << "find(33) successfully !" << endl;
	else														cout << "failed to find(33) !" << endl;


	cout << "在头尾删除数据..." << endl;
	IntDeque.pop_back();
	IntDeque.pop_front();
	cout << "双向队列中所有的元素如下:" << endl;
	for(auto it = IntDeque.begin(); it != IntDeque.end(); it++){
		cout << setw(3) << *it;
	}
	cout << endl;
}


/*
void push(const value_type& _Val){ c.push_back(_Val); }  //在末尾追加一个元素;
void pop(){ c.pop_back(); }  //擦除最后一个元素


//栈 stack支持 empty() size() top() push() pop()  
栈中的数据是先进后出的,一个是在同一端存取数据
由于栈只是进一步封装别的数据结构,并提供自己的接口
*/


void StackTest()
{
	//可以使用list或vector作为栈的容器,默认是使用deque的。  
	stack<int, list<int>> SL;
	stack<int, vector<int>> SV;


	for(int i = 0; i < 10; i++){//压入数据
		SL.push(i+1); SV.push(10-i);
	}
	//栈的大小  
	cout << "SL.size() = " << SL.size() << ", SV.size() = " << SV.size() << ". " << endl;
	cout << "The elements of StackList is below : " << endl;
	while(!SL.empty()){
		cout << setw(4) << SL.top(); SL.pop();
	}
	cout << endl << "The elements of StackVector is below : " << endl;
	while(!SV.empty()){
		cout << setw(4) << SV.top(); SV.pop();
	}
	cout << endl;
}


/*
//单向队列 queue支持 empty() size() front() back() push() pop()
在一端存入数据,另一端取出数据。单向队列中的数据是先进先出(First In First Out,FIFO)
*/
void QueueTest()
{
	//可以使用list作为单向队列的容器,默认是使用deque的。
	queue<int, list<int>> QL;
	queue<int> QD;


	for(int i = 0; i < 10; i++){//压入数据
		QL.push(i+1); QD.push(10-i);
	}


	//单向队列的大小
	cout  << "QL.size() = " << QL.size() << ", QD.size() = " << QL.size() << endl;
	//队列头和队列尾
	cout << "QL.front() = " << QL.front() << ", QL.back() = " << QL.back() << endl;
	cout << "QD.front() = " << QD.front() << ", QD.back() = " << QD.back() << endl;
	cout << "The elements of QueueList is below : " << endl;
	while(!QL.empty()){
		cout << setw(4) << QL.front(); QL.pop();
	}
	cout << endl << "The elements of QueueDeque is below : " << endl;
	while(!QD.empty()){
		cout << setw(4) << QD.front(); QD.pop();
	}
	cout << endl;
}


查看评论

编程修养(六)

23、static的使用————————static关键字,表示了“静态”,一般来说,他会被经常用于变量和函数。一个static的变量,其实就是全局变量,只不过他是有作用域的全局变量。比如一个函数中的...
  • haoel
  • haoel
  • 2003-05-08 12:19:00
  • 10461

一个用Java实现的双向队列,可以分别在头尾插入和删除节点

分析,双向队列的内部实现是一个双向链表,可以分别从头尾插入和删除节点。 通常使用一个first指向头 last指向尾。然后分别维护各种next和prev指针。通常情况要考虑边界条件,即当队列本身为空...
  • sesiria
  • sesiria
  • 2016-09-19 15:57:22
  • 1630

算法研究之——链表的一些操作(创建、打印,在头部、中间、尾部插入节点)

#include using namespace std; struct Node { int data; Node* next; }; typedef class Node List_No...
  • chenxun2009
  • chenxun2009
  • 2014-11-11 23:35:23
  • 1289

线性表的初始化,头部和尾部插入,删除C/C++代码实现

线性表的源码实现
  • qq_25073253
  • qq_25073253
  • 2016-03-17 14:58:54
  • 1463

c语言:用双向链表实现双端队列(队列两端都可以进行入队出队操作)

//双端队列的实现:队列左为端口1,队列右为端口2 #include #include #include #define LEN sizeof(struct DQueuelist) using nam...
  • qq_28598203
  • qq_28598203
  • 2016-04-08 14:22:31
  • 3702

栈与队列(queue and stack)

题目:使用有限个栈实现队列,保证每个队列操作都只需要常数此栈的操作 初看题目感觉似乎单个栈可以在常数次栈操作的情况下实现出队列或者入队列的操作,但是考虑到可以使用多个栈,则可以优化相应的出入队列...
  • shaya118
  • shaya118
  • 2014-11-02 16:33:48
  • 976

STL之deque(双向队列)

双向队列的操作如下: dequeq;//定义一个双向队列q,类型为long long q.push_front(a);//将a从队首插入队列 q.push_back(a);/...
  • cym19981017
  • cym19981017
  • 2016-04-21 17:06:52
  • 666

简单链表11

  • 2012年07月05日 23:42
  • 322KB
  • 下载

STL:队列(queue)、优先级队列(priority_queue )及双向队列(deque)总结

参考博客:http://blog.csdn.net/column/details/stl-morewindows.html queue单向队列与栈有点类似,一个是在同一端存取数据,另一个是在一端存入...
  • dabusideqiang
  • dabusideqiang
  • 2014-08-28 15:38:29
  • 1284

Java双向队列,用双向链表实现的

java双向队列,基于双向链表实现 同时实现正反向迭代
  • Temmo_Lin
  • Temmo_Lin
  • 2017-08-15 12:06:12
  • 206
    个人资料
    等级:
    访问量: 1862
    积分: 1064
    排名: 5万+
    文章存档