93 lines
1.8 KiB
C++
93 lines
1.8 KiB
C++
#include <iostream>
|
|
|
|
// 节点结构
|
|
template <typename T>
|
|
struct Node {
|
|
T data;
|
|
Node* next;
|
|
Node(const T& data) : data(data), next(nullptr) {}
|
|
};
|
|
|
|
// 链栈类模板
|
|
template <typename T>
|
|
class LinkStack {
|
|
private:
|
|
Node<T>* top; // 栈顶指针
|
|
size_t size; // 栈大小
|
|
|
|
public:
|
|
// 构造函数
|
|
LinkStack() : top(nullptr), size(0) {}
|
|
|
|
// 析构函数
|
|
~LinkStack() {
|
|
while (!isEmpty()) {
|
|
pop();
|
|
}
|
|
}
|
|
|
|
// 判断栈是否为空
|
|
bool isEmpty() const {
|
|
return top == nullptr;
|
|
}
|
|
|
|
// 获取栈的大小
|
|
size_t getSize() const {
|
|
return size;
|
|
}
|
|
|
|
// 入栈操作
|
|
void push(const T& data) {
|
|
Node<T>* newNode = new Node<T>(data);
|
|
newNode->next = top;
|
|
top = newNode;
|
|
++size;
|
|
}
|
|
|
|
// 出栈操作
|
|
void pop() {
|
|
if (isEmpty()) {
|
|
std::cout << "Stack is empty, cannot pop.\n";
|
|
return;
|
|
}
|
|
Node<T>* temp = top;
|
|
top = top->next;
|
|
delete temp;
|
|
--size;
|
|
}
|
|
|
|
// 获取栈顶元素
|
|
T peek() const {
|
|
if (isEmpty()) {
|
|
throw std::runtime_error("Stack is empty, cannot peek.");
|
|
}
|
|
return top->data;
|
|
}
|
|
};
|
|
|
|
int main() {
|
|
LinkStack<int> stack;
|
|
|
|
// 测试入栈操作
|
|
stack.push(10);
|
|
stack.push(20);
|
|
stack.push(30);
|
|
|
|
// 打印栈顶元素
|
|
std::cout << "Top element: " << stack.peek() << std::endl;
|
|
|
|
// 测试出栈操作
|
|
stack.pop();
|
|
std::cout << "Top element after pop: " << stack.peek() << std::endl;
|
|
|
|
// 测试栈大小
|
|
std::cout << "Stack size: " << stack.getSize() << std::endl;
|
|
|
|
// 清空栈
|
|
while (!stack.isEmpty()) {
|
|
std::cout << "Popping: " << stack.peek() << std::endl;
|
|
stack.pop();
|
|
}
|
|
|
|
return 0;
|
|
} |