如何用C++实现一个基本的顺序栈数据结构,包括栈的初始化、获取栈顶元素、检测栈是否已满、检查栈是否为空、以及执行入栈和出栈操作?请提供详细的代码实现。
时间: 2024-12-25 13:24:59 浏览: 0
在C++中,我们可以使用数组来实现一个简单的顺序栈数据结构。下面是一个基础的顺序栈实现:
```cpp
#include <iostream>
// 定义栈的最大容量
const int MAX_SIZE = 10;
class Stack {
private:
// 栈底指针
int top;
// 存储栈元素的数组
int arr[MAX_SIZE];
public:
// 初始化栈,如果超过最大容量则抛出异常
Stack() : top(-1) {}
// 检查栈是否为空
bool isEmpty() const {
return top == -1;
}
// 检测栈是否已满
bool isFull() const {
return top == MAX_SIZE - 1;
}
// 入栈操作,将元素添加到栈顶
void push(int value) {
if (isFull()) {
std::cout << "Stack is full!\n";
return;
}
top++;
arr[top] = value;
}
// 出栈操作,弹出并返回栈顶元素,若栈为空则抛出异常
int pop() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty!");
}
int value = arr[top];
top--;
return value;
}
// 获取栈顶元素,不执行任何操作
int peek() const {
if (isEmpty()) {
throw std::runtime_error("Stack is empty!");
}
return arr[top];
}
};
int main() {
Stack s;
try {
s.push(1);
s.push(2);
s.push(3);
std::cout << "Top element is: " << s.peek() << "\n";
std::cout << "Popped element is: " << s.pop() << "\n";
if (!s.isEmpty()) {
std::cout << "Stack is not empty after popping.\n";
} else {
std::cout << "Stack is now empty.\n";
}
// 测试栈满的情况
for (int i = 4; i <= MAX_SIZE; ++i) {
s.push(i);
}
std::cout << "Trying to push an element when stack is full...\n";
s.push(5); // 这里会打印"Stack is full!"
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
这个实现包含了栈的基本操作,如初始化、判断空/满、入栈、出栈和查看栈顶元素。请注意,在实际项目中,为了更好的错误处理,可以考虑使用智能指针和动态内存管理代替固定大小的数组。
阅读全文