C++如何实现一个栈(Stack)_C++数据结构之后进先出(LIFO)的实现

首先实现基于动态数组的栈类,支持push、pop、top、isEmpty和size操作,通过resize扩容;随后用main函数测试栈功能,最后介绍使用STL stack的方法。

在C++中实现一个栈,核心是遵循“后进先出”(LIFO)原则。可以通过数组或链表来构建,也可以借助标准库。下面从零开始手写一个基于动态数组的栈,并说明其关键操作和设计思路。

栈的基本操作

一个完整的栈应支持以下基本操作:

  • push(x):将元素x压入栈顶
  • pop():移除并返回栈顶元素
  • top():查看栈顶元素但不删除
  • isEmpty():判断栈是否为空
  • size():返回栈中元素个数

使用动态数组实现栈

下面是一个简单的C++栈类实现,使用动态数组存储数据,自动扩容:

#include 
using namespace std;

class Stack { private: int* data; // 动态数组存储元素 int capacity; // 当前最大容量 int topIndex; // 栈顶索引

// 扩容函数
void resize() {
    capacity *= 2;
    int* newData = new int[capacity];
    for (int i = 0; i zuojiankuohaophpcn topIndex; ++i) {
        newData[i] = data[i];
    }
    delete[] data;
    data = newData;
}

public: // 构造函数 Stack(int initCapacity = 4) { capacity = initCapacity; data = new int[capacity]; topIndex = 0; }

// 析构函数
~Stack() {
    delete[] data;
}

// 压栈
void push(int value) {
    if (topIndex == capacity) {
        resize();
    }
    data[topIndex++] = value;
}

// 弹栈
void pop() {
    if (isEmpty()) {
        cout zuojiankuohaophpcnzuojiankuohaophpcn "栈为空,无法弹出元素!\n";
        return;
    }
    --topIndex;
}

// 获取栈顶元素
int top() const {
    if (isEmpty()) {
        throw runtime_error("栈为空!");
    }
    return data[topIndex - 1];
}

// 判断是否为空
bool isEmpty() const {
    return topIndex == 0;
}

// 返回元素个数
int size() const {
    return topIndex;
}

};

测试栈的功能

写一个简单的main函数验证栈的行为:

int main() {
    Stack s;
s.push(10);
s.push(20);
s.push(30);

cout zuojiankuohaophpcnzuojiankuohaophpcn "栈顶元素: " zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn endl;  // 输出 30
s.pop();
cout zuojiankuohaophpcnzuojiankuohaophpcn "弹出后栈顶: " zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn endl;   // 输出 20

while (!s.isEmpty()) {
    cout zuojiankuohaophpcnzuojiankuohaophpcn "当前栈顶: " zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn endl;
    s.pop();
}

return 0;

}

使用STL中的stack

实际开发中,可以直接使用C++标准库提供的stack

#include 
#include 
using namespace std;

int main() { stack s; s.push(1); s.push(2); s.push(3);

cout zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn endl;  // 输出 3
s.pop();
cout zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn endl;  // 输出 2

return 0;

}

标准库的stack默认基于deque实现,也可指定为vectorlist,如:stack>

基本上就这些。手动实现有助于理解底层机制,而项目中推荐使用STL以提高效率和安全性。