【C++ STL】細數C++ STL 的那些事 -- stack(棧)

 1)Stack是一種關聯容器,是通過簡單地修飾線性類deque的接口而獲得的另一種“容器類”,往往被歸結爲配接器(adapter)而不是容器(container)。

                 stack不能遍歷,所以沒有迭代器!!!

                 底層容器除了 deque外還可採用 list。

                   

            2)使用

                    需加載的頭文件:   #include<stack>
                                                using namespace std;

                   template <class T, class Container = deque<T> >


            3)主要的方法有如下:     

                          empty() 堆棧爲空則返回真

                    pop() 移除棧頂元素(不會返回棧頂元素的值) 
                    push() 在棧頂增加元素
                    size() 返回棧中元素數目
                    top() 返回棧頂元素


              4)例子:

[html] view plain copy
  1. #include <iostream>  
  2. #include <stack>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     stack <int> myStack;//定義棧  
  7.     myStack.push(5);//壓棧  
  8.     myStack.push(6);  
  9.     myStack.push(7);  
  10.     myStack.pop(); //出棧  
  11.     cout<<myStack.top()<<endl;  
  12.     cout<<myStack.size()<<endl;  
  13.     cout<<myStack.empty()<<endl;  
  14.     return 0;  
  15. }  
讀文件例子

[html] view plain copy
  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include <cstdlib>  
  5. #include <stack>  
  6. using namespace std;  
  7. int main(){  
  8.     ifstream inf;  
  9.     inf.open("temp.txt");  
  10.     if (!inf) {  
  11.         cerr<<"cannot open file for input!"<<endl;  
  12.         return EXIT_FAILURE;    }  
  13.     stack <string> s;  
  14.     string line;  
  15.     while (getline(inf,line)){//讀入一行文本  
  16.         s.push(line); //壓入棧 }  
  17.     inf.close();  
  18.     while (!s.empty()){//棧不空,輸出棧頂元素  
  19.         cout<<s.top()<<endl;  
  20.         s.pop();    //彈棧}  
  21.     return 0;  
  22. }  


             5)stack的實現

[html] view plain copy
  1. #include <deque>  
  2. #include <stdexcept>  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. template <typename T>  
  7. class stack  
  8. {  
  9. private:  
  10.     deque<T> elems; //實際容器  
  11.   
  12. public:  
  13.     void push(T const&);  
  14.     void pop(void);  
  15.     T top() const;  
  16.     bool empty() const  
  17.     {  
  18.         return elems.empty();  
  19.     }  
  20.   
  21.     template<typename T2> //類成員模板  
  22.     stack <T>operator= (stack<T2> const&);  
  23.   
  24.     //實現迭代器。  
  25.     typedef const T* const_iterator;  
  26.     T* end(void);  
  27.     T* begin(void);  
  28. };  
  29.   
  30. template <typename T>  
  31. template <typename T2>  
  32. stack<T>& stack<T>::operator =(const stack<T2> &op2)  
  33. {  
  34.     if((void*)this == (void*)&op2)  
  35.         return *this;  
  36.     stack<T2> tmp(op2);  
  37.     elems.clear();  
  38.   
  39.     while(!tmp.empty())  
  40.     {  
  41.         elems.push_front(tmp.top());  
  42.         tmp.pop();  
  43.     }  
  44.     return *this;  
  45. }  
  46.   
  47. template <typename T>  
  48. void stack<T>::push(T const& elem)  
  49. {  
  50.     elems.push_back(elem);  
  51. }  
  52.   
  53. template <typename T>  
  54. void stack<T>::pop()  
  55. {  
  56.     if(elems.empty())  
  57.     throw out_of_range("stack<>::pop() :empty stack");  
  58.         elems.pop_back();  
  59. }  
  60. //實現迭代器。  
  61. template <typename T>  
  62. T stack<T>::top() const  
  63. {  
  64.     if(elems.empty())  
  65.         throw out_of_range("stack<>::top() :empty stack");  
  66.     return elems.back();  
  67. }  
  68. //指向第一個元素。  
  69. template <typename T>  
  70. T* stack<T>::begin()  
  71. {  
  72.     return (&(elems.front()));  
  73. }  
  74. //這裏要實現的是指向未端的下一元素。  
  75. template <typename T>  
  76. T* stack<T>::end()  
  77. {  
  78.     return ((&(elems.back()))+1);  
  79. }  
  80.   
  81. int main()  
  82. {  
  83.     stack<int> intStack;  
  84.     stack<int> charStack;  
  85.   
  86.     intStack.push(10);  
  87.     intStack.push(19);  
  88.     intStack.push(39);  
  89.   
  90.     cout<<"top:"<<intStack.top()<<endl;  
  91.     cout<<"賦值並輸出:"<<endl;  
  92.   
  93.     charStack = intStack;  
  94.   
  95.     stack<int>::const_iterator iterator;  
  96.     iterator = charStack.begin();  
  97.     while(iterator != charStack.end())  
  98.     {  
  99.         cout<< *iterator<<endl;  
  100.         ++iterator;  
  101.     }  
  102. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章