下面是一个使用C++类来实现的栈(Stack)的例子。栈是一种后进先出(Last In, First Out, LIFO)的数据结构,它允许在顶部插入(push)和移除(pop)元素。
// Stack.h 头文件
#ifndef STACK_H
#define STACK_H
class Stack {
public:
// 构造函数
Stack(int size);
// 析构函数
~Stack();
// 公有成员函数,提供栈的服务
bool push(int value); // 入栈
bool pop(); // 出栈
int top() const; // 查看栈顶元素
bool isEmpty() const; // 检查栈是否为空
bool isFull() const; // 检查栈是否已满
private:
// 私有成员变量,对客户隐藏
int* stackArray;
int capacity;
int topIndex;
};
#endif // STACK_H
// Stack.cpp 实现文件
#include "Stack.h"
#include <iostream>
Stack::Stack(int size) : capacity(size), topIndex(-1) {
stackArray = new int[capacity];
}
Stack::~Stack() {
delete[] stackArray;
}
bool Stack::push(int value) {
if (isFull()) {
std::cerr << "栈已满,无法添加元素" << std::endl;
return false;
}
stackArray[++topIndex] = value;
return true;
}
bool Stack::pop() {
if (isEmpty()) {
std::cerr << "栈为空,无法移除元素" << std::endl;
return false;
}
--topIndex;
return true;
}
int Stack::top() const {
if (isEmpty()) {
std::cerr << "栈为空" << std::endl;
return -1; // 或者可以抛出异常
}
return stackArray[topIndex];
}
bool Stack::isEmpty() const {
return topIndex == -1;
}
bool Stack::isFull() const {
return topIndex == capacity - 1;
}
// main.cpp
#include "Stack.h"
int main() {
Stack myStack(5); // 创建一个容量为5的栈
myStack.push(1);
myStack.push(2);
myStack.push(3);
std::cout << "栈顶元素: " << myStack.top() << std::endl;
myStack.pop();
std::cout << "移除栈顶元素后,新的栈顶元素: " << myStack.top() << std::endl;
return 0;
}
在这个例子中,Stack
类是一个ADT,它定义了栈的基本操作:入栈(push)、出栈(pop)、查看栈顶元素(top)、检查栈是否为空(isEmpty)和检查栈是否已满(isFull)。这些操作通过公有成员函数提供,而栈的内部数组(stackArray)、容量(capacity)和栈顶索引(topIndex)作为私有成员变量,外部无法直接访问,确保了数据的安全性。用户只能通过提供的接口与栈交互,而无需关心内部的实现细节。