【干货】容器适配器实现两个栈模拟队列
来源:互联网 发布:2345好压mac版 编辑:程序博客网 时间:2024/06/09 07:42
用两个栈模拟队列的思想就是“倒水思想”,这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下:
#include<iostream>#include<string>#include<cassert>struct __TrueType//类型萃取{bool Get(){return true;}};struct __FalseType{bool Get(){return false;}};template <class _Tp>struct TypeTraits{typedef __FalseType __IsPODType;};template <>struct TypeTraits< bool>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< char>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< unsigned char >{typedef __TrueType __IsPODType;};template <>struct TypeTraits< short>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< unsigned short >{typedef __TrueType __IsPODType;};template <>struct TypeTraits< int>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< unsigned int >{typedef __TrueType __IsPODType;};template <>struct TypeTraits< long>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< unsigned long >{typedef __TrueType __IsPODType;};template <>struct TypeTraits< long long >{typedef __TrueType __IsPODType;};template <>struct TypeTraits< unsigned long long>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< float>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< double>{typedef __TrueType __IsPODType;};template <>struct TypeTraits< long double >{typedef __TrueType __IsPODType;};template <class _Tp>struct TypeTraits< _Tp*>{typedef __TrueType __IsPODType;};template <class T>//自定义类型实现线性表class SeqList{public:SeqList():_size(0),_capacity(10),_array(new T[_capacity]){memset(_array, 0, sizeof(T)*_capacity);}SeqList(const T &x):_size(1),_capacity(10),_array(new T[_capacity]){_array[0] = x;}SeqList(const SeqList & x){_array = new T[x._size];my_memcpy(_array, x._array, sizeof(T)*x._size);_capacity = x._size;_size = _capacity;}void PushBack(const T & x){_CheckCapacity();_array[_size++] = x;}void PushFront(const T & x){_CheckCapacity();for (size_t i = _size; i > 1; i--){_array[_size] = _array[_size - 1];}_size++;_array[0] = x;}void PopBack(){_size--;}void PopFront(){assert(_size);for (size_t i = 0; i < _size - 1; i++){_array[i] = _array[i + 1];}_size--;}size_t Size(){return _size;}SeqList & operator = (SeqList l){swap(_array, l._array);swap(_size, l._size);swap(_capacity, l._capacity);return *this;}~SeqList(){if (_array){delete[] _array;}}T& operator [] (const size_t t){return _array[t];}private:void _CheckCapacity(){if (_size >= _capacity){_capacity *= 3;T * tmp = new T[_capacity];memcpy(tmp, _array, sizeof(T)*_capacity);delete[] _array;_array = tmp;}}void my_memcpy(T* dst, const T* src, size_t size){if (TypeTraits <T>::__IsPODType().Get()){memcpy(dst, src, size*sizeof (T));}else{for (size_t i = 0; i < size; ++i){dst[i] = src[i];}}}size_t _size;size_t _capacity;T *_array;};template <class T,typename Contianer = SeqList<T> >//适配器实现栈class Stack{public:void Push(const T & x){_con.PushBack(x);}void Pop(){_con.PopBack();}size_t Size(){return _con.Size();}bool Empty(){return Size() == 0;}T&top(){return _con[Size() - 1];}protected:Contianer _con;};template <class T,typename container = Stack<T> >//以栈为适配器,实现队列class Queue{public:bool Empty(){return (_InStack.Empty() && _OutStack().Empty());}size_t Size(){return _InStack.Size() + _OutStack.Size();}void Push(const T &x){_InStack.Push(x);}void Pop(){size_t MoveCount = _InStack.Size() - 1;for (size_t iCount = MoveCount; iCount > 0; --iCount){T temp = _InStack.top();_OutStack.Push(temp);_InStack.Pop();}_InStack.Pop();while (false == _OutStack.Empty()){T temp = _OutStack.top();_InStack.Push(temp);_OutStack.Pop();}}T& Front(){return _InStack.top();}T& Back(){size_t MoveCount = _InStack.Size() - 1;for (size_t iCount = MoveCount; iCount > 0; --iCount){T temp = _InStack.top();_OutStack.Push(temp);_InStack.Pop();}T ret = _InStack.top();while (false == _OutStack.Empty()){T temp = _OutStack.top();_Instack.Push(temp);_OutStack.Pop();}return ret;}void PrintQueue(){size_t MoveCount = _InStack.Size();for (size_t iCount = MoveCount; iCount > 0; --iCount){T temp = _InStack.top();_OutStack.Push(temp);_InStack.Pop();}while (false == _OutStack.Empty()){T temp = _OutStack.top();_InStack.Push(temp);cout << "<-" << temp;_OutStack.Pop();}cout << endl;}private:container _InStack;container _OutStack;};
测试用例如下:
void Test(){Queue<int> q1;q1.Push(1);q1.Push(2);q1.Push(3);q1.Push(4);q1.Push(5);q1.Push(6);q1.PrintQueue();q1.Pop();q1.PrintQueue();}
如有什么不足或疑问,希望指教
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1761921
0 0
- 【干货】容器适配器实现两个栈模拟队列
- 模拟实现容器适配器栈和队列
- 模拟容器适配器栈和队列
- 两个栈模拟实现一个队列
- 【算法】用两个栈模拟实现队列
- 容器适配器(队列、优先队列、栈)
- 容器适配器实现栈
- 模拟实现容器适配器 stack queue
- 两个队列模拟栈
- 两个栈模拟队列
- 两个队列模拟栈
- 两个栈模拟一个队列和两个队列模拟一个栈(c++实现)
- java实现两个栈模拟实现队列出队
- C++ 容器适配器-队列
- 面试题研究 用两个栈模拟实现队列
- 两个队列模拟栈的操作(stl实现)
- java使用两个栈模拟队列的实现
- 用两个队列模拟实现一个栈的过程
- 【技巧】通过适配器模式完成栈的数据结构
- 【代码】模板动态线性表&类型萃取
- 【干货】share智能指针的模拟实现
- 【一张大大的图片】类和对象知识点总结
- 【智能指针的延伸】两种定制删除器的实现方法
- 【干货】容器适配器实现两个栈模拟队列
- 【代码】C++实现广义表及其测试用例
- 【代码】C++实现二叉树基本操作及测试用例
- 二叉树的线索化算法思想详解
- 【代码】c++堆的简单实现
- 堆排序算法思路详解
- 【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
- 【代码】稀疏矩阵的压缩存储与转置算法
- LINUX下的几个常见的环境变量