[c++初阶]stack和queue的使用以及模拟实现

一、stack

1.stack的介绍

通过文档,我们可以了解到以下的内容:

  • 区别于vector等容器,stack是一种容器适配器。通俗的讲,stack封装了一个其他的容器,并提供特定的成员函数来对容器进行操作并遵循栈的后进先出(Last-in First-out)原则。
  • stack的底层容器至少要支持以下操作:
  • empty:判空
  • size:获取容器有效元素个数
  • back:获取容器尾部元素
  • push_back:尾插
  • pop_back:尾删
  • 通过这些操作,我们就可以实现栈的压入和弹出等行为
  • 我们可以指定vector、list和deque作为stack的底层容器,如果没有指定,默认情况下使用deque,后面会对该容器进行介绍

2.stack的使用

在实例化与stack类类似的容器适配器时,模板参数除了必须要传入元素类型,还可以选择传入底层容器的种类

例如:

1)empty
bool empty() const;

检测栈是否为空

2)size
size_type size() const;

返回stack中元素的个数

3)top
value_type& top();

const value_type& top(); const

返回栈顶元素的引用

4)push
void push(const value_type& val);

将val压入栈中

5)pop
void pop();

将栈顶元素弹出

例如:

void test_stack()
{
	stack<int, list<int>> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);

	cout << st.size() << endl;
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
}

运行结果:

二、 stack的模拟实现

前面提到,stack是一个容器适配器,其底层封装了其他的容器,这里我们以vector作为底层容器

namespace STACK
{
	template<class T, class Container = vector<T>> 
    //一个模板参数传入数据类型,一个模板参数传入底层容器   
	class stack
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val); //压栈即在容器尾部插入数据
		}
 
		void pop()
		{
			_con.pop_back(); //出栈即删除容器尾部的数据
		}
 
		const T& top()
		{
			return _con.back(); //栈顶元素即容器尾部的元素
		}
 
		size_t size()
		{
			return _con.size();
		}
 
		bool empty()
		{
			return _con.empty();
		}
 
	private:
		Container _con; //对容器进行封装
	};
}

三、queue

1. 了解queue

通过文档,我们可以了解到以下的内容:

  • 队列也是一种容器适配器,对容器进行封装,提供特定的成员函数对容器进行操作并遵循队列的先进先出(First-in First-out)原则。
  • 队列的底层容器至少要支持以下操作:
  • empty:判空
  • size:获取容器有效元素个数
  • front:获取容器头部元素
  • back:获取容器尾部元素
  • push_back:尾插
  • pop_front:头删

通过这些操作,我们就可以实现队列的出队和入队等行为。

  • 我们可以指定list和deque作为queue的底层容器,如果没有指定,默认情况下使用deque

2.使用queue

1)empty
bool empty() const;

 检测队列是否为空

2)size
size_type size() const;

返回队列中有效元素的个数

3)front
value_type& front();

const value_type& front(); const

返回队头元素的引用

4)back
value_type& back();

const value_type& (); cons
5)push
void push(const value_type& val);

从队尾将元素val入队列

6)pop
void pop();

将队头元素出队列

例如:

void test_queue()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	cout << q.size() << endl;
	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
	cout << endl;
}

运行结果:

3.queue的模拟实现

因为queue需要头删,如果底层使用vector效率太低,这里我们使用list作为queue的底层容器

namespace QUEUE
{
	template<class T, class Container = list<T>>
	class queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val); //入队列,即从容器尾部插入数据
		}
 
		void pop()
		{
			_con.pop_front(); //出队列,即从容器头部删除数据
		}
 
		const T& front()
		{
			return _con.front();
		}
 
		const T& back()
		{
			return _con.back();
		}
 
		size_t size()
		{
			return _con.size();
		}
 
		bool empty()
		{
			return _con.empty();
		}
 
	private:
		Container _con;
	};
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 21:02:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 21:02:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 21:02:02       58 阅读
  4. Python语言-面向对象

    2024-07-18 21:02:02       69 阅读

热门阅读

  1. Linux中的文件夹作用

    2024-07-18 21:02:02       22 阅读
  2. 子树的重心

    2024-07-18 21:02:02       23 阅读
  3. 网站流量统计分析工具之plausible.io

    2024-07-18 21:02:02       23 阅读
  4. 设计模式--享元模式

    2024-07-18 21:02:02       22 阅读
  5. ReferenceEquals

    2024-07-18 21:02:02       24 阅读
  6. 2024国家护网面试小结

    2024-07-18 21:02:02       21 阅读
  7. 数据结构第28节 字典树

    2024-07-18 21:02:02       20 阅读
  8. 详解深度学习中的epochs

    2024-07-18 21:02:02       23 阅读
  9. 梧桐数据库: 数据库技术中的重写子查询技术

    2024-07-18 21:02:02       23 阅读