用兩個棧模擬隊列的思想就是“倒水思想”,這里我們用自定義類型模擬出線性表,再用線性表做容器實現(xiàn)棧的數(shù)據(jù)結構,最后用棧來實現(xiàn)隊列,代碼如下:
扶余網(wǎng)站建設公司創(chuàng)新互聯(lián),扶余網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為扶余數(shù)千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的扶余做網(wǎng)站的公司定做!#include#include #include struct __TrueType//類型萃取 { bool Get() { return true; } }; struct __FalseType { bool Get() { return false; } }; template 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 struct TypeTraits< _Tp*> { typedef __TrueType __IsPODType; }; template //自定義類型實現(xiàn)線性表 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 ::__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 >//適配器實現(xiàn)棧 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 >//以棧為適配器,實現(xiàn)隊列 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() { Queueq1; q1.Push(1); q1.Push(2); q1.Push(3); q1.Push(4); q1.Push(5); q1.Push(6); q1.PrintQueue(); q1.Pop(); q1.PrintQueue(); }
如有什么不足或疑問,希望指教
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。