C++ stack (STL容器适配器)

6 篇文章 0 订阅

目录

适配器

stack

stack的使用

stack模拟实现


适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),适配器是将一个类的接口转换成客户希望的另外一个接口。

举个栗子, 咱们香港的插头和我们内地是不一的, 如下图, 这种插头在咱们内地是不方便使用的, 要是香港同胞到对岸深圳转一转, 被繁华的深圳所吸引, 不禁多留了两天, 那这时候手机要充电怎么充电啊, 不过没关系, 我们有适配器, 其实真正给手机充电的还是手机充电器, 适配器只是方便了人们的使用而已. 

   
          港版充电器                                                     适配器                                                           适配器的使用

常见的容器适配器stack , queuepriority_queue,  它们就相当于上图的适配器, 真正给手机充电的是还是充电头, 同样的道理, 它们底层是靠别的容器实现的
例如:
stack可以用vector, deque, list实现. 
queue可以用 deque, list实现
priority_queue, 可以用 deque, vector实现

stack

1. stack是一种容器适配器,专门用在具有后进先出操作的需求中,其删除只能从容器的一端进行元素的插入与提取操作。
2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类必须支持以下操作
    empty:判空操作
    back:获取尾部元素操作
    push_back:尾部插入元素操作
    pop_back:尾部删除元素操作
4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。
5. 需要头文件#include<stack>
6. 为什么选择deque作为stack的底层默认容器
主要原因
deque优点: 两端插入删除最快的
deque缺点: 迭代器复杂效率低
stack利用了优点规避了缺点, 在末端插删, 且并未使用迭代器, 所以deque最优

stack图示 :

C++STL容器适配器之queue
C++ STL容器适配器之priority_queue

stack的使用

函数名称接口说明
stack() 构造空的栈
empty() 检测stack是否为空
size() 返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop() 将stack中栈顶的元素弹出

 

stack模拟实现

mystack.h

#pragma once
#include<deque>
using namespace std;
template<class T, class Con = deque<T>>
class mystack {
	Con s;
public:
	mystack() {

	}

	void push(const T& val) {
		s.push_back(val);
	}
	void pop() {
		s.pop_back();
	}
	T& top() {
		return s.back();
	}
	int size() {
		return s.size();
	}
	bool empty() {
		return s.empty();
	}
};

测试入口main.cpp 

#include<iostream>
#include<stack>
#include<deque>
#include<list>
#include<vector>
#include"mystack.h"
using namespace std;

void Test_stack() {
	cout << "STL中的stack\n";
	stack<int, deque<int>> s;
	for (int i = 1; i <= 5; ++i) {
		s.push(i);
	}
	cout << "size = " << s.size() << endl;
	while (!s.empty()) {
		cout << s.top() << endl;
		s.pop();
	}
	cout << "size = " << s.size() << endl;
}
void Test_mystack() {
	cout << "自己实现的的stack\n";
	mystack<int> s;
	//mystack<int, list<int>> s;
	//mystack<int, vector<int>> s;
	for (int i = 1; i <= 5; ++i) {
		s.push(i);
	}
	cout << "size = " << s.size() << endl;
	while (!s.empty()) {
		cout << s.top() << endl;
		s.pop();
	}
	cout << "size = " << s.size() << endl;
}
int main() {
	Test_stack();
	Test_mystack();
	system("pause");
	return 0;
}

运行结果 

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值