棧(stack),在電腦科學中,是一種特殊的序列形式的資料結構,它的特殊之處在於只能允許在鏈結序列或陣列的一端(稱為棧頂,top)進行加入(push)和輸出(pop)的運算。棧可以用一維動態陣列或鍊錶的形式來完成。
由於堆疊資料結構只允許在一端進行操作,因而按照後進先出(lifo, last in first out)的原理運作。堆疊資料結構使用兩種基本操作:推入(push)和彈出(pop):
推入(push):將資料放入堆疊的頂端(陣列形式或序列形式),堆疊頂端top指標加一。
彈出(pop):將頂端資料資料輸出(回傳),堆疊頂端資料減一。
先來看棧的架構設計:
首先來看抽象棧實現方式:
class stack : public virtual container
;
再來看棧的動態陣列實現方式:
class stackasarray : public stack
;stackasarray::stackasarray( unsigned int size )
:array(size)
void stackasarray::purge()
} count = 0;
}stackasarray::~stackasarray()
object& stackasarray::top() const
return *array [count - 1u];
}void stackasarray::push( object& obj )
array [count++] = &obj;
}object& stackasarray::pop()
return *array [--count];
}void stackasarray::accept( visitor& visitor ) const
}iterator& stackasarray::newiterator() const
注意最後乙個函式,返回stackasarray內部類iter,這是乙個迭代器模式的典型應用:
class stackasarray::iter : public iterator
;stackasarray::iter::iter( stackasarray const& _stack )
:stack (_stack)
bool stackasarray::iter::isdone() const
object& stackasarray::iter::operator*() const
else }
void stackasarray::iter::operator++()
}void stackasarray::iter::reset()
接下來看棧的鍊錶實現方式:
class stackaslinkedlist : public stack
;class stackaslinkedlist::iter : public iterator
;stackaslinkedlist::stackaslinkedlist()
:list()
void stackaslinkedlist::purge()
} list.purge ();
count = 0;
}stackaslinkedlist::~stackaslinkedlist()
void stackaslinkedlist::push( object& object )
object& stackaslinkedlist::pop()
object& result = *list.first ();
list.extract (&result);
--count;
return result;
}object& stackaslinkedlist::top() const
return *list.first ();
}void stackaslinkedlist::accept( visitor& visitor ) const
}iterator& stackaslinkedlist::newiterator() const
stackaslinkedlist::iter::iter( stackaslinkedlist const& _stack )
:stack (_stack)
bool stackaslinkedlist::iter::isdone() const
object& stackaslinkedlist::iter::operator*() const
else }
void stackaslinkedlist::iter::operator++()
}void stackaslinkedlist::iter::reset()
{ position = stack.list.head ();
基本資料結構 棧
基本資料結構 棧 一.線性資料結構 我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,...
基本資料結構 棧
我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,有時被稱為左右,某些情況被稱為前後。...
基本資料結構 棧
棧的特徵是後進先出 last in,first out,lifo 棧上的插入操作稱為壓入 push 刪除操作稱為彈出 pop 下面使用乙個陣列s n 來實現乙個最多容納n個元素的棧。定義乙個屬性指向最新插入的元素。棧的操作 如下 public class stack public stack int...