#include
#include
#include
template
class Stack {
private:
std::vector _data;
public:
void push(const T& val) { _data.push_back(val); }
void pop() {
if (_data.empty()) throw std::underflow_error("Stack empty");
_data.pop_back();
}
T& top() {
if (_data.empty()) throw std::underflow_error("Stack empty");
return _data.back();
}
const T& top() const {
if (_data.empty()) throw std::underflow_error("Stack empty");
return _data.back();
}
bool empty() const { return _data.empty(); }
size_t size() const { return _data.size(); }
};
int main() {
// int
Stack si;
si.push(10); si.push(20);
std::cout << "int top: " << si.top() << '\n'; // 20
// double
Stack sd;
sd.push(3.14); sd.push(2.71);
std::cout << "double top: " << sd.top() << '\n'; // 2.71
// char
Stack sc;
sc.push('A'); sc.push('B');
std::cout << "char top: " << sc.top() << '\n'; // B
// long
Stack sl;
sl.push(10000000000L);
std::cout << "long top: " << sl.top() << '\n';
// bool
Stack sb;
sb.push(true); sb.push(false);
std::cout << "bool top: " << std::boolalpha << sb.top() << '\n'; // false
return 0;
}
std::vector 自動擴容/釋放,無裸指針template
class FixedStack {
T _buf[CAP];
size_t _top = 0;
public:
bool push(const T& v) { if (_top == CAP) return false; _buf[_top++] = v; return true; }
bool pop(T& out) { if (_top == 0) return false; out = _buf[--_top]; return true; }
};
無動態分配,適合無堆內存環境。