基本資料結構(3) —— 棧

來源:互聯網
上載者:User
1 棧

棧(stack),在電腦科學中,是一種特殊的串列形式的資料結構,它的特殊之處在於只能允許在鏈結串列或陣列的一端(稱為棧頂,top)進行加入(push)和輸出(pop)的運算。棧可以用一維動態數組或鏈表的形式來完成。

 

由於堆棧資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。堆棧資料結構使用兩種基本操作:推入(push)和彈出(pop):

推入(push):將資料放入堆棧的頂端(陣列形式或串列形式),堆棧頂端top指標加一。

彈出(pop):將頂端資料資料輸出(回傳),堆棧頂端資料減一。

 

先來看棧的架構設計:

首先來看抽象棧實現方式:

class Stack : public virtual Container{public:virtual Object& Top () const = 0;virtual void Push (Object&) = 0;virtual Object& Pop () = 0;};

再來看棧的動態數組實現方式:

class StackAsArray : public Stack{Array<Object*> array;class Iter;public:StackAsArray (unsigned int size);~StackAsArray ();// ...Object& Top() const;void Push(Object& obj);Object& Pop();void Purge ();void Accept (Visitor& visitor) const;Iterator& NewIterator() const;friend class Iter;};StackAsArray::StackAsArray( unsigned int size ):array(size){count = 0;}void StackAsArray::Purge(){if (IsOwner()){for (unsigned int i = 0; i < count; ++i){delete array [i];}}count = 0;}StackAsArray::~StackAsArray(){Purge ();}Object& StackAsArray::Top() const{if (count == 0){throw domain_error ("stack is empty");}return *array [count - 1U];}void StackAsArray::Push( Object& obj ){if (count == array.Length ()){throw domain_error ("stack is full");}array [count++] = &obj;}Object& StackAsArray::Pop(){if (count == 0){throw domain_error ("stack is empty");}return *array [--count];}void StackAsArray::Accept( Visitor& visitor ) const{for (unsigned int i = 0;i < count && !visitor.IsDone (); ++i){visitor.Visit (*array [i]);}}Iterator& StackAsArray::NewIterator() const{return *new StackAsArray::Iter(*this);}

 

注意最後一個函數,返回StackAsArray內部類Iter,這是一個迭代器模式的典型應用:

class StackAsArray::Iter : public Iterator{StackAsArray const& stack;unsigned int position;public:Iter (StackAsArray const& _stack);// ...bool IsDone () const;Object& operator * () const;void operator ++ ();void Reset ();};StackAsArray::Iter::Iter( StackAsArray const& _stack ):stack (_stack){Reset();}bool StackAsArray::Iter::IsDone() const{return position >= stack.count;}Object& StackAsArray::Iter::operator*() const{if (position < stack.count){return *stack.array[position];}else{return NullObject::Instance ();//return NULL;}}void StackAsArray::Iter::operator++(){if (position < stack.count){++position;}}void StackAsArray::Iter::Reset(){position = 0;}

 

接下來看棧的鏈表實現方式:

class StackAsLinkedList : public Stack{LinkedList<Object*> list;class Iter;public:StackAsLinkedList ();~StackAsLinkedList ();void Purge();void Accept (Visitor& visitor) const;Iterator& NewIterator() const;// ...void Push (Object& object);Object& Pop ();Object& Top () const;friend class Iter;};class StackAsLinkedList::Iter : public Iterator{StackAsLinkedList const& stack;ListElement<Object*> const* position;public:Iter (StackAsLinkedList const& _stack);// ...bool IsDone () const;Object& operator * () const;void operator ++ ();void Reset ();};StackAsLinkedList::StackAsLinkedList():list(){}void StackAsLinkedList::Purge(){if (IsOwner ()){ListElement<Object*> const* ptr;for (ptr = list.Head (); ptr != 0; ptr = ptr->Next ()){delete ptr->Datum ();}}list.Purge ();count = 0;}StackAsLinkedList::~StackAsLinkedList(){Purge();}void StackAsLinkedList::Push( Object& object ){list.Prepend (&object);++count;}Object& StackAsLinkedList::Pop(){if (count == 0){throw domain_error ("stack is empty");}Object& result = *list.First ();list.Extract (&result);--count;return result;}Object& StackAsLinkedList::Top() const{if (count == 0){throw domain_error ("stack is empty");}return *list.First ();}void StackAsLinkedList::Accept( Visitor& visitor ) const{ListElement<Object*> const* ptr;for (ptr = list.Head ();ptr != 0 && !visitor.IsDone (); ptr = ptr->Next ()){visitor.Visit (*ptr->Datum ());}}Iterator& StackAsLinkedList::NewIterator() const{return *new StackAsLinkedList::Iter(*this);}StackAsLinkedList::Iter::Iter( StackAsLinkedList const& _stack ):stack (_stack){Reset ();}bool StackAsLinkedList::Iter::IsDone() const{return position == 0;}Object& StackAsLinkedList::Iter::operator*() const{if (position != 0){return *position->Datum ();}else{return NullObject::Instance ();}}void StackAsLinkedList::Iter::operator++(){if (position != 0){position = position->Next ();}}void StackAsLinkedList::Iter::Reset(){position = stack.list.Head ();

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.