头文件MyStack_container.h
#pragma once
#include <vector>
#include <deque>
template< typename T, typename CONT = std::vector<T> >
class MyStack {
private:
CONT elems;//容器
public:
MyStack();//默认构造
void push(T const&);//入栈
void pop();//出栈
T top() const;//返回栈顶元素
bool empty() const { return elems.empty(); }//返回栈是否为空
};
#define __MYSTACK_CONTAINER__
#include "MyStack_container.cpp"
实现头文件MyStack_container.cpp
#ifdef __MYSTACK_CONTAINER__
//默认构造
template<typename T, typename CONT>
inline
MyStack<T, CONT>::MyStack() {}
//入栈
template<typename T, typename CONT>
inline
void MyStack<T, CONT>::push(T const& elem) {
elems.push_back(elem);
}
//出栈
template<typename T, typename CONT>
inline
void MyStack<T, CONT>::pop() {
if (elems.empty())
throw std::out_of_range("Stack<>::pop() : empty stack");
elems.pop_back();
}
//返回栈顶元素
template<typename T, typename CONT>
inline
T MyStack<T, CONT>::top() const {
if (elems.empty())
throw std::out_of_range("Stack<>::top() : empty stack");
return elems.back();
}
#endif // __MYSTACK_CONTAINER__
测试mian.cpp
#include <iostream>
#include <string>
#include <deque>
#include "MyStack_container.h"
int main()
{
//模板缺省
{
try {
//定义int栈
MyStack<int> intStack;//默认用vector
//定义double栈
MyStack<double, std::deque<double> > doubleStack;//使用deque容器
//使用int栈
intStack.push(7);
std::cout << "intStack top is " << intStack.top() << std::endl;
intStack.pop();
if (intStack.empty())
std::cout << "intStack is empty";
//使用double栈
doubleStack.push(7.777);
std::cout << "doubleStack top is " << doubleStack.top() << std::endl;
doubleStack.pop();
doubleStack.pop();
}
catch (const std::exception& ex) {
std::cerr << "Exception: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
}
}