【干货】容器适配器实现两个栈模拟队列

发布时间:2020-06-24 21:46:49 作者:pawnsir
来源:网络 阅读:332

    用两个栈模拟队列的思想就是“倒水思想”,这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下:

#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();


}

    如有什么不足或疑问,希望指教

推荐阅读:
  1. 剑指offer:两个队列模拟一个栈
  2. 面试题:用两个栈实现队列,用两个队列实现栈

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

适配器 队列

上一篇:大数据实践总结分享

下一篇:redis可以存储几个key

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》