C++ STL stack实现(栈)
1)Stack是一种关联容器,是通过简单地修饰线性类deque的接口而获得的另一种“容器类”,往往被归结为配接器(adapter)而不是容器(container)。 stack不能遍历,所以没有迭代器!!! 底层容器除了 deque外还可采用 list。
·
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 <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;
- }
#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;
- }
- }
更多推荐
已为社区贡献1条内容
所有评论(0)