【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)例:
ファイルの読み込み例
5)stackの実現
stackは遍歴できないので、反復器はありません!!!
下位コンテナはdequeのほかlistも使用できます.
2)使用
ロードするヘッダファイル:#include
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;
}
}