当前位置: 首页 > news >正文

广东网站设计品牌设计中国施工企业协会官网

广东网站设计品牌设计,中国施工企业协会官网,国内最好的少儿编程机构排名,江西建设门户网站1. stack的选型 对于栈的实现是我们非常熟悉的过程: C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 _top表示下标,_capacity表示空间大小: 那么按照我们原来的思路,利用_top和_capacity T*来给stack构形。 temp…

1. stack的选型

对于栈的实现是我们非常熟悉的过程:

C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客

_top表示下标,_capacity表示空间大小:

那么按照我们原来的思路,利用_top和_capacity T*来给stack构形。

template<typename T>
class stack {
public:
private:T* _arr;int _top;int _capacity;
};

  如果只是按照c语言的思路来实现一个T*的多接口数组就显得有些重复了。


2. 容器适配器 

2.1设计模式

    设计模式就像兵法一样,不是直接拿着刀就上去看(早期的代码都会相对无序),而是要讲究套路和方法的,要注重可维护性。只完成了功能的要求,但是在后期如果要debug或者打补丁就很麻烦。现在的设计模式有23种。

    我们现在已经或多或少接触了两种设计模式,一种是迭代器模式,一种是适配器模式。

比如迭代器模式:

                                         

容器适配器一般都没有iterator,因为iterator的出现会改变其最本质的访问方式。

2.2适配器

适配器是一种用于转换的装置:

适配器:适配器的功能就是转换

比如电源适配器。高压线中的电变压到220v的生活用电也需要电源适配器,220v通过充电线变成给手机的几伏充电线也需要电源适配器。

那什么是容器适配器呢?

栈就是容器适配器,队列也是容器适配器。

我们可以自己手搓数组来实现各个接口。那既然要如上文的C语言思路一样使用数组,为什么不直接用vector呢?

既然能用vector去适配一个栈出来,那为什么不能用list去适配一个栈出来呢?如下:

template<typename T>
class stack{
public:
private:list<T> _st;
};

  或者

template<typename T>
class stack{
public:
private:vector<T> _st;
};

vector和list中都肯定包含push_back  pop_back  back  front这些函数

直接去套用即可。那么我如果两个容器都想使用呢?实现两个非常接近的容器适配器吗?

显然不是,我们直接在模版处传入我们想使用的容器。


3.代码实现 

直接在template处多写一个typename方便传容器类型。

               

如果传入的容器不能使用push_back,说明这个容器不能用于适配,报错即可。

模版参数就像函数参数一样,也可以给缺省值。

比如我们此处就默认stack是包装vector实现的。

template<typename T,typename Container = vector<int>>
class stack {
public:void push(const T& x) {_st.push_back(x);}void pop() {_st.pop_back();}T& top() {return _st.back();}const T& top() const {return _st.back();}bool empty() {return _st.empty();}size_t size() {return _st.size();}private:Container _st;};

就可以直接像正常的vector那样使用了。

或者用list去作为适配的容器:


再用代码来实现queue

queue适合用vector作为容器来适配吗?

在stack中的插入删除都在尾部(栈顶)进行,vector恰好在尾部进行操作比较简单,比较吻合。

而queue既需要在尾部操作,又需要在头部操作,所对于vector这种头插头删时间复杂度都是O(n)的容器来说就不是非常合适。因此我们认为vector不能用于适配 

这是用vector实现的方法:

                   

但是代价太大了。

所以我们将queue按照list和deque作为可适配的容器实现:

template<typename T,typename Container = list<int>>
class queue {
public:void push(const T& x) {_q.push_back(x);}void pop() {_q.pop_front();}bool empty() {return  _q.empty();}T& front() {return _q.front();}const T& front() const {return _q.front();}T& back() {return _q.back();}const T& back() const {return _q.back();}size_t size() {return _q.size();}
private:Container _q;
};

测试:


4. 初识deque(双端队列)

list可以头插头删和尾差尾删

vector支持尾差尾删和方括号访问(当然头插头删可以通过insert和erase实现,但是时间复杂度较高)

deque就是list和vector的结合体

那是不是用deque来实现stack和queue的适配更方便呢?

                                   

底层结构天差地别,但是实际使用效果似乎都不错。

http://www.yayakq.cn/news/274244/

相关文章:

  • 兰州网站建设wordpress布局模板
  • 易无忧建站广州软件开发培训机构有哪些
  • 深圳龙华建设局官方网站网站界面设计的相关指南
  • 个人如何在企业网站做实名认证新手怎么注册自媒体账号
  • 如何建微信微商城网站wordpress主题实例制作
  • 腾讯 微商 网站 建设软件工程师报名官网
  • 企业网站icp是什么wordpress给幻灯片添加图片
  • 对网站建设 意见和建议怎样做旅游网站
  • 淮安网站定制泉州市培训建设系统中心网站
  • 网站开发选题背景WordPress热门排行榜插件
  • 网站 左右浮动 广告宿迁房产网信息网
  • 高级网站开发工程师考试题东莞网页网站制作
  • 宁波模版建站公司品牌注册怎么注册
  • 主营商城网站建设网站2级域名 还是子目录
  • 正能量网站有哪些东莞代理公司注册
  • 南通做网站优化的公司中国造价工程建设监理协会网站
  • 响应式网站尺寸节点北方工业大学网站建设
  • 有专门做最佳推荐的网站加拿大28网站开发
  • 长尾词挖掘工具爱站网公司简介模板100字范文
  • 可以做pos机的网站怎么知道网站的ftp
  • 网站代付系统怎么做北京seo服务商找行者seo
  • 制作企业免费网站杭州网站建设费用
  • 网站关键字工具2345网址导航智能主板
  • 网站前台架构中山免备案网站建设
  • 网站开发个人简历word下载大连专业制作网站
  • 网站怎么制作成二维码wordpress子分类模板
  • 如何建立一个网站链接把文件信息存里关于网络营销的方法
  • 做教学的视频网站导航类网站怎么做排名
  • 网站动态海报效果怎么做的湖南省建设厅建管处
  • 网站开发流程电话wordpress 饭店主题