用链表实现栈的基本操作。 Node STACK {int data; node *link;}; Node *top=NULL;并举例
时间: 2024-10-18 13:18:20 浏览: 31
Node.js环境下JavaScript实现单链表与双链表结构
链表实现栈(Stack)是一种常见的数据结构应用,使用链表的优势在于插入和删除元素的时间复杂度可以达到O(1),因为它们只需要修改指针而不需要移动大量元素。在C++中,你可以定义如下的`Node`结构体表示链表节点:
```cpp
struct Node {
int data;
Node* link;
};
```
接下来,我们可以定义一个栈的模板类`Stack`,包含基本的操作:
```cpp
template <typename T>
class Stack {
private:
Node<T>* top; // 栈顶节点
public:
// 构造函数,初始化为空栈
Stack() : top(nullptr) {}
// 检查是否为空
bool isEmpty() const {
return top == nullptr;
}
// 入栈(push)
void push(const T& value) {
Node<T>* newNode = new Node<T>{value, top};
top = newNode;
}
// 出栈(pop)
T pop() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
T result = top->data;
Node<T>* temp = top;
top = top->link;
delete temp;
return result;
}
// 获取栈顶元素但不移除(peek)
T peek() const {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
return top->data;
}
// 错误处理:释放所有内存(如果实现了动态内存分配)
~Stack() {
while (!isEmpty()) {
pop();
}
delete top;
}
};
```
这里我们实现了以下基本操作:
1. `push`: 向栈顶添加新元素。
2. `pop`: 删除并返回栈顶元素。
3. `peek`: 查看但不删除栈顶元素。
4. `isEmpty`: 判断栈是否为空。
5. `~Stack`:析构函数,确保在栈不再被引用时自动清理内存。
现在你可以实例化这个栈,例如:
```cpp
int main() {
Stack<int> myStack;
try {
myStack.push(10);
myStack.push(20);
std::cout << "Top element: " << myStack.peek() << "\n";
std::cout << "Popped element: " << myStack.pop() << "\n";
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
阅读全文