能否提供一个使用链表实现栈(包含push和pop操作)的示例代码,并解释链表作为栈的数据结构有何特点?基于c++实现
时间: 2024-10-29 11:11:00 浏览: 27
数据结构:图解链表,用链表实现栈的Pop和Push(c语言版)
当然可以。在C++中,我们可以使用双向链表(因为栈通常是后进先出,LIFO,所以后一个元素可以轻松地成为第一个被弹出的)来实现一个简单的栈。这里是一个基本的实现:
```cpp
#include <iostream>
// 定义链表节点
struct Node {
int data;
Node* next;
Node* prev; // 双向链接
};
// 创建一个新的节点
Node* createNode(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
newNode->prev = nullptr;
return newNode;
}
// 初始化空栈
class Stack {
private:
Node* top;
public:
Stack() : top(nullptr) {}
// 压入数据(模拟push操作)
void push(int value) {
Node* newNode = createNode(value);
if (top != nullptr) {
newNode->prev = top;
top->next = newNode;
}
else {
newNode->next = newNode;
}
top = newNode;
}
// 弹出数据(模拟pop操作)
int pop() {
if (top == nullptr) {
throw std::runtime_error("Stack is empty");
}
int value = top->data;
Node* poppedNode = top;
top = top->prev;
if (top != nullptr) {
top->next = nullptr;
}
delete poppedNode;
return value;
}
// 检查栈是否为空
bool isEmpty() const {
return top == nullptr;
}
};
int main() {
Stack stack;
stack.push(10);
stack.push(20);
std::cout << "Popped element: " << stack.pop() << std::endl;
return 0;
}
```
链表作为栈的数据结构特点:
1. **动态空间分配**:链表可以根据需要增长或收缩,而不需要预先指定大小,这使得它非常适合存储不确定大小的数据。
2. **插入和删除高效**:对于`push`和`pop`操作,只需要修改头部或尾部的指针,时间复杂度通常是O(1),比数组更节省时间和空间。
3. **不支持随机访问**:由于不是连续存储,链表无法直接通过索引来访问元素,这可能会导致某些算法效率较低。
阅读全文