C++----剖析stack、queue

stack与queue与前面学过的容器不同,它是容器适配器,什么意思呢,就是使用之前学过的vector、list来模拟实现stack、queue,接下来来实现一下。

cpp 复制代码
	template<class T, class container = std::deque<T>>
	class stack
	{
	public:
		void pop()
		{
			c.pop_back();
		}

		void push(const T& value)
		{
			c.push_back(value);
		}

		const T& top()
		{
			return c.back();
		}

		size_t size()
		{
			return c.size();
		}

		bool empty()
		{
			return c.empty();
		}

	private:
		container c;
	};

其中,模板class就是参数,与函数参数十分类似,它不仅可以是数据类型,还可以是逻辑类型,比如后面的容器参数,给了一个默认参数deque。在使用的过程中呢,我们也可以使用vector、list作为底层容器:

cpp 复制代码
void test1()
{
	w::stack<int,std::vector<int>> s;
	//w::stack<int, std::list<int>> s;
	//w::stack<int, std::string> s;

	s.push(1);
	s.push(2);
	s.push(3);
	s.push(300);
	std::cout << s.top()<<std::endl;
	s.pop();
	std::cout << s.top() << std::endl;;
	s.pop();
	std::cout << s.top() << std::endl;;
	s.pop();
	std::cout << s.top() << std::endl;;
}

vector以及list都可以打印出正确的数字,但是使用string时,出现了错误,300打印为了44,为什么呢?string是"char的vector"所以可以用来接收数字,但是由于char只有8个字节,所以范围为-128~127,也就是256个数,在接收300时发生截断,得到了44(可以看一下补码,计算可得截断后的数字)。还有一件事,就是在模拟实现stack时,一定要复用可用容器的共有函数。

queue:由于queue需要先进先出,所以肯定会存在头删,那么就不再使用vector作为底层容器,因为vector不提供直接的头删。也不可以使用erase删除头节点!虽然理论上是可行的,大部分容器也都有erase,但是考虑到vector头删效率太低,要挪动大量数据,所以不使用vector作为queue的底层容器!

cpp 复制代码
template<class T, class container = std::deque<T>>//队列不用vector
	class queue
	{
	public:
		void pop()
		{
			c.pop_front();
		}

		void push(const T& value)
		{
			c.push_back(value);
		}

		const T& back()
		{
			return c.back();
		}

		const T& front()
		{
			return c.front();
		}

		size_t size()
		{
			return c.size();
		}

		bool empty()
		{
			return c.empty();
		}

	private:
		container c;
	};
相关推荐
lolo大魔王2 分钟前
Go语言的反射机制
开发语言·后端·算法·golang
那个失眠的夜16 分钟前
AspectJ
java·开发语言·数据库·spring
程序员-King.19 分钟前
【基础分析】—— 条件变量wait(lock, 谓词)
c++·c·多线程·条件变量
故事和你9123 分钟前
洛谷-算法1-7-搜索3
数据结构·c++·算法·leetcode·动态规划
网域小星球35 分钟前
C++ 从 0 入门(四)|继承、多态、this 指针、深浅拷贝(C++ 面试终极收官)
开发语言·c++·面试·多态·继承·this指针·深浅拷贝
CoderYanger1 小时前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
钮钴禄·爱因斯晨1 小时前
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
java·开发语言·前端·javascript·css·html
布说在见1 小时前
企业级 Java 登录注册系统构建指南(附核心代码与配置)
java·开发语言
草莓熊Lotso1 小时前
一文读懂 Java 主流编译器:特性、场景与选择指南
java·开发语言·经验分享
想唱rap1 小时前
C++智能指针
linux·jvm·数据结构·c++·mysql·ubuntu·bash