STL--stack queue deque

文章介绍了C++STL中的stack和queue容器适配器,它们分别用于后进先出(LIFO)和先进先出(FIFO)操作。stack默认使用deque作为底层容器,而queue默认使用list。同时,文章还讨论了deque的特点,它是双端队列,适用于stack和queue的实现,支持在两端进行插入和删除操作。此外,文中提供了自定义的stack和queue模拟实现示例。
摘要由CSDN通过智能技术生成

stack

一、stack介绍

stack是一种容器适配器,专门设计用于后进先出,其中元素仅从容器的一端插入和提取

template <class T, class Container = deque<T> > class stack;

二、stack接口

函数名称功能说明
empty判断容器是否为空
size返回容器容量大小
top返回栈顶数据
push从栈顶插入元素
pop删除栈顶元素

三、stack模拟实现

#pragma once
#include<iostream>
#include<vector>
#include<list>
using std::cout;
using std::endl;

namespace mystack
{
	// 适配器模式/配接器
	template<class T,class Container = std::vector<T>>
	//默认为容器栈
	//类模板半缺省,默认为数组栈
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		bool size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
		//通过已有容器适配,从而实现链式栈,数组栈
		//vector<T> _v;
	};



	void test_1()
	{
		stack<int, std::vector<int>> st1;
		st1.push(1);
		st1.push(2);
		st1.push(3);
		st1.push(4);
		st1.push(5);
		while (!st1.empty())
		{
			cout << st1.top() << " ";
			st1.pop();
		}
		cout << endl;
	}
}

queue

一、queue介绍

queue是一种容器适配器,专门用于在先进先出操作,其中从容器一端插入元素,另一端提取元素

template <class T, class Container = deque<T> > class queue;

二、queue接口 

函数名称功能说明
empty判断容器是否为空
size返回容器容量大小
top返回栈顶数据
push从栈顶插入元素
pop删除栈顶元素

三、queue模拟实现

#pragma once
#include<iostream>
#include<vector>
#include<list>
using std::cout;
using std::endl;

namespace myqueue
{
	// 适配器模式/配接器
	template<class T, class Container = std::list<T>>
	//默认为链式队列
	//类模板半缺省,默认为数组栈
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		bool size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;

	};



	void test_1()
	{
		queue<int> q1;//默认为链式队列
		q1.push(1);
		q1.push(2);
		q1.push(3);
		q1.push(4);
		q1.push(5);
		while (!q1.empty())
		{
			cout << q1.top() << " ";
			q1.pop();
		}
		cout << endl;
	}
}

deque

一、deque介绍

Deque(通常发音为“deck”)double-e nded queue的不规则首字母缩略词

deque是具有动态大小的序列容器,可以在两端(正面或背面)扩展或收缩

允许通过随机访问迭代器直接访问单个元素,并通过根据需要扩展和收缩容器来自动处理存储。

deque相当于是vector+list。但与vector不同在于,deque不能保证将所有的元素保存在连续的存储位置。deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域

deque容器通过一个数组来存放各个连续空间的首地址,也就是说deque数组中存放的全是指针,指针指向的连续空间用于存储数据,后面将这款连续区域称为buffer

deque会将每一个连续空间存储满之后,才将数据存放置下一个连续空间

一般用于stack与queue的底层数据结构

优点缺点

1.相比于vector,扩容代价低。只需要扩容存放指针的数组

2.头插头删,尾插尾删效率高

3.支持随机访问(效率没有vector高)

1.buffer固定大小,中间插入删除困难,随机访问较易(一般情况是固定大小)

2.buffer不固定大小,中间插入删除较易,随机访问困难

3.优势不像vector与list突出

4.不适合遍历,需要频繁检验是否到达buffer边界

template < class T, class Alloc = allocator<T> > class deque;

二、deque接口

1.容量操作:

函数名称功能说明
empty检测deque是否为空,是返回true,否则返回false
size返回数组大小

2.访问与遍历:

函数名称功能说明
begin+end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin+rend返回第一个元素的reverse_iterator,即end位置。返回最后一个元素下一个位置的reverse_iterator,即begin位置
front返回deque的第一个元素的引用
back返回deque的最后一个元素的引用

3.修改操作:

函数名称接口说明
push_front在deque首元素钱插入值为val的元素
pop_front 删除deque中的第一个元素
push_back在deque尾部插入值为val的元素
pop_back删除deque最后一个元素
insert在deque position位置中插入值为val的元素
erase删除deque position位置的元素
swap交换两个deque中的元素
clear清空deque中的有效元素

STL库中deque实现stack与queue

#include<deque>
#include <list>
namespace my_stl
{
	template<class T, class Con = std::deque<T>>
	//template<class T, class Con = list<T>>
	class queue
	{
	public:
		queue() {}
		void push(const T& x) { _c.push_back(x); }
		void pop() { _c.pop_front(); }
		T& back() { return _c.back(); }
		const T& back()const { return _c.back(); }
		T& front() { return _c.front(); }
		const T& front()const { return _c.front(); }
		size_t size()const { return _c.size(); }
		bool empty()const { return _c.empty(); }
	private:
		Con _c;
	};


	template<class T, class Con = std::deque<T>>
	//template<class T, class Con = vector<T>>
	//template<class T, class Con = list<T>>
	class stack
	{
	public:
		stack() {}
		void push(const T& x) { _c.push_back(x); }
		void pop() { _c.pop_back(); }
		T& top() { return _c.back(); }
		const T& top()const { return _c.back(); }
		size_t size()const { return _c.size(); }
		bool empty()const { return _c.empty(); }
	private:
		Con _c;
	};
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值