赞
踩
栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它只允许在一端(称为栈顶)进行插入和删除操作。栈的这种特性使得它在解决函数调用、括号匹配、表达式求值等问题时具有天然的优势。在C++中,栈可以通过标准库中的`std::stack`模板类来实现,也可以手动使用数组或链表等数据结构来实现。
根据底层实现的不同,栈可以分为静态栈和动态栈。静态栈是在编译时确定其大小,通常使用数组来实现;动态栈则是在运行时动态分配内存,大小可以随需调整,通常使用链表或动态数组来实现。
基于数组的栈通常包括以下几个部分:
1. 一个数组,用于存储栈中的元素。
2. 一个整型变量,用于记录栈顶元素的位置(通常指向栈顶元素的下一个位置)。
当进行入栈操作时,将元素放入数组的末尾,并更新栈顶位置;当进行出栈操作时,从数组的末尾移除元素,并更新栈顶位置。
下面是一个简单的基于数组的栈操作的C++实现:
- #include <iostream>
- #include <vector>
- #include <stdexcept>
- using namespace std;
- template <typename T>
- class ArrayStack {
- private:
- vector<T> elements;
-
- public:
- // 判断栈是否为空
- bool isEmpty() const {
- return elements.empty();
- }
-
- // 获取栈的大小
- size_t size() const {
- return elements.size();
- }
-
- // 入栈操作
- void push(const T& value) {
- elements.push_back(value);
- }
-
- // 出栈操作
- void pop() {
- if (isEmpty()) {
- throw out_of_range("Stack is empty!");
- }
- elements.pop_back();
- }
-
- // 获取栈顶元素
- T& top() {
- if (isEmpty()) {
- throw out_of_range("Stack is empty!");
- }
- return elements.back();
- }
-
- // 获取栈顶元素(常量版本)
- const T& top() const {
- if (isEmpty()) {
- throw out_of_range("Stack is empty!");
- }
- return elements.back();
- }
- };
-
- int main() {
- ArrayStack<int> stack;
-
- // 入栈操作
- stack.push(1);
- stack.push(2);
- stack.push(3);
-
- // 输出栈的大小
- cout << "Size of stack: " << stack.size() << std::endl;
-
- // 输出栈顶元素
- cout << "Top element: " << stack.top() << std::endl;
-
- // 出栈操作
- stack.pop();
- stack.pop();
-
- // 再次输出栈顶元素
- cout << "Top element after popping: " << stack.top() << std::endl;
-
- return 0;
- }
结果如下所示:
在这个例子中,我们使用`vector`作为底层数组来实现栈。`push`方法用于入栈操作,将元素添加到数组的末尾;`pop`方法用于出栈操作,移除数组的最后一个元素;`top`方法用于获取栈顶元素。此外,我们还提供了`isEmpty`和`size`方法来检查栈是否为空以及获取栈的大小。在`main`函数中,我们展示了如何使用这个基于数组的栈类进行基本的栈操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。