C++ ----->std :: stack ~~ std :: queue__模拟实现
  L8iEHH07GzZb 2023年11月02日 66 0

各位好友,本期开战  Stack(栈区)~~ Queue(队列)

------->Stack(栈区)

对于 栈区, 可使用  Vector (容器)~~ List (链表)进行模拟实现 !--->如下 :>

//栈区__模拟实现 "Stack.h"
//注意:>deque 适配器
#include <iostream>
#include <deque>
#include <vector>
#include <list>

using std :: cout;
using std :: endl;
using std :: vector;
using std :: list;
using std :: deque;

namespace UC
{
  template<class T, class Container = deque<T>>
	class stack
  {
  	public:
    void push(const T& x)
    {
    	_con.push_back(x);
    }
    void pop()
    {
    	_con.pop_back();
    }
    T& Top()
    {
    	return _con.back();
    }
    bool empty()
    {
    	_con.emppty();
    }
    size_t size()
    {
    	return _con.size();
    }
    private:
    Container _con;
  };
}

------>测试__Stack :>

//测试栈区
//
#include "Stack.h"
void test_stack()
{
	UC ::stack<int, vector<int>> T1;
  
  T1.push(21);
  T1.push(22);
  T1.push(23);
  
  T1.push(32);
  T1.push(38);
  
  while(!T1.empty())
  {
  	cout << T1.Top() << " ";
    T1.pop();
  }
  cout << endl;
  
  UC ::stack<int, list<int>> T2;
  
  T2.push(110);
  T2.push(111);
  T2.push(112);
  
  T2.push(123);
  T2.push(138);
  
  while(!T2.empty())
  {
  	cout << T2.Top() << " ";
    T2.pop();
  }
  cout << endl;
}

int main()
{
  test_stack();
	return 0;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色代码图样 :>

------>"Stack.h"

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序



------>"Stack.cpp"

C++ ----->std :: stack ~~ std :: queue__模拟实现_适配器__优缺点_02


------->Queue(队列)

注意 :>队列 模拟, vector(容器)不支持 头插 与头删 。 因此, 可以使用 List 进行 实现 !

queue 接口有 头删 , 然而 ,用  vector 进行分装 效率太低, 故 可借助  List  进行模拟实现 !

//队列__模拟实现 "Queue.h"
//注意:>deque 适配器
#include <iostream>
#include <list>
#include <deque>
#include <vector>

using std :: cout;
using std :: endl;
using std :: deque;
using std :: list
using std :: vector;

namespace UC
{
  template<class T, class Container = deque<T>>
	class queue
  {
  	public:
    void push(const T& x)
    {
    	_con.push_back(x);
    }
    void pop()
    {
      //使用 vector 进行创建变量
      //此种头删不支持
    	//_con.pop_front();
      
      //强制让 vector 支持 头删
      //注意:效率很低
      _con.earse(_con.begin());
    }
    T& front()
    {
    	return _con.front();
    }
    T& back()
    {
    	return _con.back();
    }
    size_t size()
    {
    	return _con.size();
    }   
    bool empty()
    {
    	return _con.empty();
    }
    private:
    Container _con;
  };
}

------->测试__Queue :>

//测试 队列
//注意:>deque 适配器
#include "Queue.h"

void test_queue()
{
	UC :: queue<int, list<int>> Q1;
  
  Q1.push(21);
  Q1.push(22);
  Q1.push(23);
  
  Q1.push(32);
  Q1.push(38);
  
  while(!Q1.empty())
  {
  	cout << Q1.Top() << " ";
    Q1.pop();
  }
  cout << endl;
  
 //强制使用 vector(容器)进行 创建变量
 //此种方法效率 极其低 !
  UC :: queue<int, vector<int>> Q2;
  
  Q2.push(110);
  Q2.push(111);
  Q2.push(112);
  
  Q2.push(123);
  Q2.push(138);
  
  while(!Q2.empty())
  {
  	cout << Q2.Top() << " ";
    Q2.pop();
  }
  cout << endl;
}

int main()
{
  test_queue();
	return 0;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色代码图样 :>

------>"Queue.h"

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序_03



------->"Test__queue.cpp" ----->NO.1 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序_04



-------->"Test__queue.cpp" ------>NO.2 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_适配器__优缺点_05


各位好友,上述 实现过程 涉及到一个新知识点 :>deque 适配器 

下面讲述 什么是 适配器 ?适配器 有哪些优缺点 ?

----->如下 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_Satck ~~ Queue_06

--------->何为 适配器 ?

适配器 又称 :>容器适配器 !根据 STL 标准库中 Stack queue 的底层结构 ,并没有将二者 划分到 容器行列 !而是将它们称为 容器的适配器 ;

而 Stack queue 只是对容器的接口进行了 包装, STL  Stack  queue 默认使用的容器 为

deque (双端队列)


--------->原因 :>

(1)Vector 相比, deque 优势 :>头部插入 和删除元素, 不需要搬移, 效率非常高 。

 Vector 扩容过程中, 需进行 搬运大量元素 。 因此, deque 更加高效 ;

(2)List 相比, deque 底层结构是连续的空间, 空间利用率较高 ;(以上两点为 优势

(3)deque 劣势 :>不适合遍历访问 。在实际中, 多用线性结构,  如, Vector 与 List ;

遍历过程中, deque 迭代器 需要频繁访问并且去检测 是否移向某一小段空间边界, 导致其效率低下 !


--------->小总结 :>

Stack (栈区)可以使用的底层结构  :> Vector List ;Queue(队列) 只能使用 List 作为底层结构 !

A. Satckqueue 不需要进行遍历(因为 stack queue 没有迭代器)只需要固定在某一端即可 ;

B.  Stack(栈区)中元素的增长, Deque 比较于 Vector 效率更高, 并不会进行大量数据的搬运 ;

Queue (队列)是连续空间,Deque 比较于 List  空间利用率更高 !


--------->deque 介绍 :>

---->deque(双端队列) 双开口 ~~ 连续的数据结构 。双开口含义 :>头尾两端 可进行插入 与删除 !

同  Vector 相比, 头插效率很高, 与 List 相比较 , 空间利用率很高 !如下 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序_07

注意 :>deque 并不是真正的 连续空间,而是由一段段 连续的小空间拼接而成

------------------------------->实际上, deque 类似于 一个动态二维数组 !


下面展示 deque(双端队列)排序 ----->效率对比 :>

---------->deque ~~ Vector :>

------->NO.1 :>

// deque(双端队列)
//排序比较 --->deque__拷贝 ~~ vector
#include <iostream>
#include <vector>
#include <deque>
#include <time.h>
#include <stdlib.h>
#include <algorithm>

using std :: cout;
using std :: endl;
using std :: deque;
using std :: vector;

int main()
{
  srand(time(0));
  
	vector<int> v1;
  vector<int> v2;
  
  const int N = 1000000;
  
  v1.reserve(N);
  v2.reserve(N);
  
  deque<int> dq;
  
  for(int i = 0; i < N; i++) 
  {
  	auto e = rand();
    
    v2.push_back(e);
    
    dq.push_back(e);
  }
  
  int begin1 = clock();
  //先拷贝到 vector
  for(auto e : dq)
  {
   	v1.push_back(e);
  }
  
  sort(v1.begin(), v1.end());
  
  //再拷贝回去
  size_t i = 0;
  for(auto& e : dq)
  {
  	e = v1[i++];
  }
  
  int end1 = clock();
  
  int begin2 = clock();
  
  sort(v2.begin(), v2.end());
  
  int end2 = clock();
  
  cout << "deque copy to vector sort :> " << end1 - begin1 << endl;
  
  cout << "vector sort :> " << end2 - begin2 << endl;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>

------->NO.1 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序_08

---------->可见 :>Vector 排序__更胜一筹 !


---------->deque__拷贝 ~~ deque :>

------->NO.2 :>

// deque(双端队列)
//排序比较 --->deque__拷贝 ~~ deque 
#include <iostream>
#include <vector>
#include <deque>
#include <time.h>
#include <stdlib.h>
#include <algorithm>

using std :: cout;
using std :: endl;
using std :: deque;
using std :: vector;

int main()
{
  srand(time(0));
  
	vector<int> v;
  
  const int N = 1000000;
  
  v.reserve(N);
  
  deque<int> dq1;
  deque<int> dq2;
  
  for(int i = 0; i < N; i++) 
  {
  	auto e = rand();
    
    dq1.push_back(e);
    
    dq2.push_back(e);
  }
  
  int begin1 = clock();
  //先拷贝到 vector
  for(auto e : dq1)
  {
   	v.push_back(e);
  }
  
  sort(v.begin(), v.end());
  
  //再拷贝回去
  size_t i = 0;
  for(auto& e : dq1)
  {
  	e = v[i++];
  }
  
  int end1 = clock();
  
  int begin2 = clock();
  
  sort(dq2.begin(), dq2.end());
  
  int end2 = clock();
  
  cout << "deque copy to vector sort :> " << end1 - begin1 << endl;
  
  cout << "deque sort :> " << end2 - begin2 << endl;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>

------->NO.2 :>

C++ ----->std :: stack ~~ std :: queue__模拟实现_deque__算法排序_09

---------->可见 :>deque 排序__更加慢 !


各位好友, 本期内容 已完结 !

下一期, 继续推进 ------>优先级队列  !  "敬请期待 !😊😊

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

L8iEHH07GzZb