C++_STL_資料結構_stack_棧
阿新 • • 發佈:2018-12-27
棧(statck)這種資料結構在計算機中是相當出名的。棧中的資料是先進後出的(First In Last Out, FILO)。棧只有一個出口,允許新增元素(只能在棧頂上增加)、移出元素(只能移出棧頂元素)、取得棧頂元素等操作。在STL中,棧是以別的容器作為底部結構,再將介面改變,使之符合棧的特性就可以了。因此實現非常的方便。下面就給出棧的函式列表和VS2008中棧的原始碼,在STL中棧一共就5個常用操作函式(top()、push()、pop()、 size()、empty() ),很好記的。
VS2008中棧的原始碼
友情提示:初次閱讀時請注意其實現思想,不要在細節上浪費過多的時間。
-
//VS2008中 stack的定義 MoreWindows整理(http://blog.csdn.net/MoreWindows)
- template<class _Ty, class _Container = deque<_Ty> >
- class stack
- { // LIFO queue implemented with a container
- public:
- typedef _Container container_type;
- typedeftypename _Container::value_type value_type;
- typedeftypename _Container::size_type size_type;
-
typedef
- typedeftypename _Container::const_reference const_reference;
- stack() : c()
- { // construct with empty container
- }
- explicit stack(const _Container& _Cont) : c(_Cont)
- { // construct by copying specified container
- }
-
bool
- { // test if stack is empty
- return (c.empty());
- }
- size_type size() const
- { // test length of stack
- return (c.size());
- }
- reference top()
- { // return last element of mutable stack
- return (c.back());
- }
- const_reference top() const
- { // return last element of nonmutable stack
- return (c.back());
- }
- void push(const value_type& _Val)
- { // insert element at end
- c.push_back(_Val);
- }
- void pop()
- { // erase last element
- c.pop_back();
- }
- const _Container& _Get_container() const
- { // get reference to container
- return (c);
- }
- protected:
- _Container c; // the underlying container
- };
可以看出,由於棧只是進一步封裝別的資料結構,並提供自己的介面,所以程式碼非常簡潔,如果不指定容器,預設是用deque來作為其底層資料結構的(對deque不是很瞭解?可以參閱《STL系列之一 deque雙向佇列》)。下面給出棧的使用範例:
- //棧 stack支援 empty() size() top() push() pop()
- // by MoreWindows(http://blog.csdn.net/MoreWindows)
- #include <stack>
- #include <vector>
- #include <list>
- #include <cstdio>
- usingnamespace std;
- int main()
- {
- //可以使用list或vector作為棧的容器,預設是使用deque的。
- stack<int, list<int>> a;
- stack<int, vector<int>> b;
- int i;
- //壓入資料
- for (i = 0; i < 10; i++)
- {
- a.push(i);
- b.push(i);
- }
- //棧的大小
- printf("%d %d\n", a.size(), b.size());
- //取棧項資料並將資料彈出棧
- while (!a.empty())
- {
- printf("%d ", a.top());
- a.pop();
- }
- putchar('\n');
- while (!b.empty())
- {
- printf("%d ", b.top());
- b.pop();
- }
- putchar('\n');
- return 0;
- }