【C++】STL容器适配器之stack&&queue

前言

目录

预备知识:

  • 容器

容器(container)用于存放数据的类模板。可变长数组、链表、平衡二叉树等数据结构在 STL 中都被实现为容器

  • 容器适配器

适配器是一种将一个类的接口转换成客户希望的另外一个接口的设计模式

  • vector

vector是一个大小可变的序列是容器

我们的stack和queue,底层实现便是将vector的接口进行了封装,对外展现出了一些符合stack和queue特性的新接口,这是一种复用的行为

在这里插入图片描述

1.stack的接口及模拟实现

stack是栈,符合LIFO(后进先出)的特点

接口 功能
empty() 判空
size() 返回元素个数
top() 返回栈顶元素
push() 压栈
pop() 弹出栈顶元素
swap() 交换

模拟实现

namespace imdanteking
{
    
    
	template<class T>
	class stack {
    
    
	public:
		stack()
		{
    
    }
		~stack()
		{
    
    }
		stack(const stack& st) {
    
    
			_v(st._v);
		}
		void push(T data) {
    
    
			_v.push_back(data);
		}
		void pop() {
    
    
			assert(!empty());
			_v.pop_back();
		}
		const T& top() {
    
    
			assert(!empty());
			return _v.back();
		}
		bool empty() {
    
    
			return _v.empty();
		}
		void swap(stack st) {
    
    
			st._v.swap(_v);
		}
		size_t size()const {
    
    
			return _v.size();
		}
	private:
		vector<T> _v;
	};


	void Test1() {
    
    
		stack<int> st1;
		cout << st1.empty() << endl;
		st1.push(1);
		cout << "size: " << st1.size() << endl;
		st1.push(2);
		st1.push(3);
		st1.push(4);
		st1.push(5);
		st1.push(6);
		cout <<"size: " << st1.size() << endl;
		while (!st1.empty()) {
    
    
			cout << st1.top() << endl;
			st1.pop();
		}
		cout << st1.empty() << endl;
		cout << "size: " << st1.size() << endl;

	}
}

2.queue的接口及模拟实现

queue是队列,符合FIFO(先进先出)的特点

接口 功能
empty() 判空
size() 返回元素个数
front() 返回队列第一个元素
back() 返回队列最后一个元素
push() 队尾插入元素
pop() 队头删除元素
swap() 交换

模拟实现

namespace imdanteking
{
    
    
	template <class T>
	class queue {
    
    
	public:
		queue() {
    
    }
		~queue() {
    
    }

		void push(const T& val) {
    
    
			_v.push_back(val);
		}
		void pop() {
    
    
			assert(!_v.empty());
			_v.erase(_v.begin());
		}
		const T& front() const {
    
    
			assert(!_v.empty());
			return _v.front();
		}
		const T& back() const {
    
    
			assert(!_v.empty());
			return _v.back();
		}
		bool empty() {
    
    
			return _v.size() == 0;
		}
		size_t size() {
    
    
			return _v.size();
		}
		void swap(queue q) {
    
    
			_v.swap(q._v);
		}
	private:
		vector<T> _v;
	};

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

3.刷题

最小栈
栈的压入、弹出序列
用两个栈实现队列
用队列实现栈
逆波兰表达式求值

猜你喜欢

转载自blog.csdn.net/m0_52640673/article/details/123267476