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)例子:

  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. }  
#include <iostream>
#include <stack>
using namespace std;
int main()
{
	stack <int> myStack;//定义栈
	myStack.push(5);//压栈
	myStack.push(6);
	myStack.push(7);
	myStack.pop(); //出栈
	cout<<myStack.top()<<endl;
	cout<<myStack.size()<<endl;
	cout<<myStack.empty()<<endl;
	return 0;
}
读文件例子

  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. }  
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <stack>
using namespace std;
int main(){
	ifstream inf;
	inf.open("temp.txt");
	if (!inf) {
		cerr<<"cannot open file for input!"<<endl;
		return EXIT_FAILURE;	}
	stack <string> s;
	string line;
	while (getline(inf,line)){//读入一行文本
		s.push(line); //压入栈	}
	inf.close();
	while (!s.empty()){//栈不空,输出栈顶元素
		cout<<s.top()<<endl;
		s.pop();	//弹栈}
	return 0;
}


             5)stack的实现

  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. }  
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐