完整代碼
enum ErrorCode { success, underflow, overflow };
template
struct Node {
StackEntry data;
Node* next;
Node(const StackEntry& item, Node* nxt = nullptr) : data(item), next(nxt) {}
};
template
class MyStack {
public:
MyStack() : pTop(nullptr) {}
~MyStack() { clear(); }
bool empty() const { return pTop == nullptr; }
int size() const {
int cnt = 0;
for (Node* p = pTop; p; p = p->next) ++cnt;
return cnt;
}
ErrorCode pop() {
if (empty()) return underflow;
Node* tmp = pTop;
pTop = pTop->next;
delete tmp;
return success;
}
ErrorCode top(StackEntry& item) const {
if (empty()) return underflow;
item = pTop->data;
return success;
}
ErrorCode push(const StackEntry& item) {
Node* node = new (std::nothrow) Node(item, pTop);
if (!node) return overflow;
pTop = node;
return success;
}
void clear() {
while (pTop) {
Node* tmp = pTop;
pTop = pTop->next;
delete tmp;
}
}
private:
Node* pTop;
};
實現要點
- 構造函數初始化 `pTop(nullptr)`,析構調用 `clear()` 防洩漏。
- `push` 用 `nothrow new` 捕獲分配失敗返回 `overflow`。
- `top` 通過引用參數返回棧頂元素,不修改棧。
- `size()` 遍歷計數,O(n);若需 O(1) 可添加 `count` 字段維護。
- 模板定義放在頭文件(或 `.tpp` 包含),確保編譯期實例化。