【C++STL】細数C++STLのこと--stack(スタック)


1)Stackは、線形クラスdequeのインタフェースを簡単に修飾することによって得られる別の「コンテナクラス」であり、コンテナ(container)ではなくアダプタ(adapter)にまとめられることが多い.
stackは遍歴できないので、反復器はありません!!!
下位コンテナはdequeのほかlistも使用できます.
                  
2)使用
ロードするヘッダファイル:#includeusing namespace std;
                   template >
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;
	}
}