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

版权声明:本文为博主原创文章,允许转载,转载请注明出处。 https://blog.csdn.net/KnightOnHourse/article/details/79972825

/*

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;
}


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页