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)例子:
#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; }
读文件例子
#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的实现
#include <deque> #include <stdexcept> #include <iostream> using namespace std; template <typename T> class stack { private: deque<T> elems; //实际容器 public: void push(T const&); void pop(void); T top() const; bool empty() const { return elems.empty(); } template<typename T2> //类成员模板 stack <T>& operator= (stack<T2> const&); //实现迭代器。 typedef const T* const_iterator; T* end(void); T* begin(void); }; template <typename T> template <typename T2> stack<T>& stack<T>::operator =(const stack<T2> &op2) { if((void*)this == (void*)&op2) return *this; stack<T2> tmp(op2); elems.clear(); while(!tmp.empty()) { elems.push_front(tmp.top()); tmp.pop(); } return *this; } template <typename T> void stack<T>::push(T const& elem) { elems.push_back(elem); } template <typename T> void stack<T>::pop() { if(elems.empty()) throw out_of_range("stack<>::pop() :empty stack"); elems.pop_back(); } //实现迭代器。 template <typename T> T stack<T>::top() const { if(elems.empty()) throw out_of_range("stack<>::top() :empty stack"); return elems.back(); } //指向第一个元素。 template <typename T> T* stack<T>::begin() { return (&(elems.front())); } //这里要实现的是指向未端的下一元素。 template <typename T> T* stack<T>::end() { return ((&(elems.back()))+1); } int main() { stack<int> intStack; stack<int> charStack; intStack.push(10); intStack.push(19); intStack.push(39); cout<<"top:"<<intStack.top()<<endl; cout<<"赋值并输出:"<<endl; charStack = intStack; stack<int>::const_iterator iterator; iterator = charStack.begin(); while(iterator != charStack.end()) { cout<< *iterator<<endl; ++iterator; } }