头文件Stack_array.h
#pragma once
template<typename T, int MAXSIZE>
class Stack {
private:
T elems[MAXSIZE];//包含元素的数组
int numElems;//当前元素的个数
public:
Stack();//构造函数
void push(T const&);//入栈
void pop();//出栈
T top() const;//返回栈顶元素
bool empty() const { return numElems == -1; }//返回栈是否为空
bool full() const { return numElems == MAXSIZE; }//返回栈是否已满
};
#define __STACK_ARRAY__
#include "Stack_Array.cpp"
实现头文件Stack_array.cpp
#ifdef __STACK_ARRAY__
//默认构造
template<typename T, int MAXSIZE>
inline
Stack<T, MAXSIZE>::Stack() : numElems(-1) {}
//入栈
template<typename T, int MAXSIZE>
inline
void Stack<T, MAXSIZE>::push(T const& elem) {
if (numElems == MAXSIZE){
throw std::out_of_range("Stack<>::push() : stack is full");
}
elems[++numElems] = elem;
}
//出栈
template<typename T, int MAXSIZE>
inline
void Stack<T, MAXSIZE>::pop() {
if (numElems == -1) {
throw std::out_of_range("Stack<>::pop() : stack is empty");
}
--numElems;
}
//返回栈顶元素
template<typename T, int MAXSIZE>
inline
T Stack<T, MAXSIZE>::top() const{
if (numElems == -1) {
throw std::out_of_range("Stack<>::top() : stack is empty");
}
return elems[numElems];
}
#endif // __STACK_ARRAY__
测试main.cpp
#include <iostream>
#include <string>
#include <deque>
#include "Stack_array.h"
int main()
{
//非模板参数
{
try {
Stack<int, 20> int20Stack; //可以存储20个int元素的栈
Stack<std::string, 40> string40Stack; //可以存储40个string元素的栈
//使用int20Stack
int20Stack.push(10);
int20Stack.push(20);
std::cout << "int20Stack top is " << int20Stack.top() << std::endl;
int20Stack.pop();
std::cout << "int20Stack top is " << int20Stack.top() << std::endl;
//使用string40Stack
string40Stack.push("hello");
string40Stack.pop();
string40Stack.pop();
}
catch (std::exception const& ex) {
std::cerr << "Exception: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
}
}
需要注意的是,浮点数(double)和类对象不能作为非模板参数