当前位置:   article > 正文

C/C++数据结构之堆栈(Stack):理解、实现与运用_c++ stack

c++ stack

当我们讨论堆栈时,我们首先需要了解它的概念和基本原理。堆栈是一种后进先出(Last In, First Out,LIFO)的数据结构,它的操作主要包括压栈(Push)和弹栈(Pop),以及查看栈顶元素(Top)。这种数据结构常用于解决与函数调用、表达式求值和回溯算法相关的问题。

堆栈是计算机科学中一种重要的数据结构,它遵循“后进先出”(Last In, First Out,LIFO)的原则,就像我们堆放书籍一样,最后放入的书籍最先取出。在本文中,我们将深入讨论堆栈的概念、抽象堆栈、顺序栈、链栈以及堆栈在数制转换中的应用,并通过详细的代码例子进行解释。

1. 堆栈的概念

堆栈是一种线性数据结构,具有两个基本操作:压栈(Push)和弹栈(Pop)。压栈表示将元素放入堆栈顶部,而弹栈表示从堆栈顶部取出元素。堆栈的典型应用包括函数调用、表达式求值和回溯算法等。

2. 抽象堆栈

在讨论具体实现之前,让我们先来看看抽象堆栈的接口:

  1. template <typename T>
  2. class AbstractStack {
  3. public:
  4. virtual void push(const T& value) = 0;
  5. virtual void pop() = 0;
  6. virtual T top() const = 0;
  7. virtual bool isEmpty() const = 0;
  8. virtual size_t size() const = 0;
  9. };

这个抽象类定义了堆栈的基本操作,我们将通过不同的实现来具体化这些操作。

3. 顺序栈及其典型成员函数

顺序栈是使用数组实现的堆栈,下面是顺序栈的实现:

  1. template <typename T>
  2. class ArrayStack : public AbstractStack<T> {
  3. private:
  4. static const size_t MAX_SIZE = 100;
  5. T data[MAX_SIZE];
  6. size_t topIndex;
  7. public:
  8. ArrayStack() : topIndex(0) {}
  9. void push(const T& value) override {
  10. if (topIndex < MAX_SIZE) {
  11. data[topIndex++] = value;
  12. } else {
  13. // 栈满,抛出异常或进行扩容等处理
  14. }
  15. }
  16. void pop() override {
  17. if (!isEmpty()) {
  18. --topIndex;
  19. } else {
  20. // 栈空,抛出异常或进行其他处理
  21. }
  22. }
  23. T top() const override {
  24. if (!isEmpty()) {
  25. return data[topIndex - 1];
  26. } else {
  27. // 栈空,抛出异常或进行其他处理
  28. return T();
  29. }
  30. }
  31. bool isEmpty() const override {
  32. return topIndex == 0;
  33. }
  34. size_t size() const override {
  35. return topIndex;
  36. }
  37. };

4. 链栈及其典型成员函数

链栈是使用链表实现的堆栈,下面是链栈的实现:

  1. template <typename T>
  2. struct Node {
  3. T data;
  4. Node* next;
  5. Node(const T& value) : data(value), next(nullptr) {}
  6. };
  7. template <typename T>
  8. class LinkedStack : public AbstractStack<T> {
  9. private:
  10. Node<T>* topNode;
  11. public:
  12. LinkedStack() : topNode(nullptr) {}
  13. void push(const T& value) override {
  14. Node<T>* newNode = new Node<T>(value);
  15. newNode->next = topNode;
  16. topNode = newNode;
  17. }
  18. void pop() override {
  19. if (!isEmpty()) {
  20. Node<T>* temp = topNode;
  21. topNode = topNode->next;
  22. delete temp;
  23. } else {
  24. // 栈空,抛出异常或进行其他处理
  25. }
  26. }
  27. T top() const override {
  28. if (!isEmpty()) {
  29. return topNode->data;
  30. } else {
  31. // 栈空,抛出异常或进行其他处理
  32. return T();
  33. }
  34. }
  35. bool isEmpty() const override {
  36. return topNode == nullptr;
  37. }
  38. size_t size() const override {
  39. size_t count = 0;
  40. Node<T>* current = topNode;
  41. while (current != nullptr) {
  42. ++count;
  43. current = current->next;
  44. }
  45. return count;
  46. }
  47. };

5. 堆栈数制转换问题

堆栈在数制转换中有着广泛的应用,我们以十进制到二进制的转换为例来演示:

  1. std::string decimalToBinary(int decimal) {
  2. LinkedStack<int> stack;
  3. while (decimal > 0) {
  4. stack.push(decimal % 2);
  5. decimal /= 2;
  6. }
  7. std::string binary;
  8. while (!stack.isEmpty()) {
  9. binary += std::to_string(stack.top());
  10. stack.pop();
  11. }
  12. return binary.empty() ? "0" : binary;
  13. }

通过堆栈的压栈和弹栈操作,我们可以轻松实现十进制到二进制的转换。

这是一篇关于C/C++数据结构之堆栈(Stack)的详细文章,覆盖了堆栈的概念、抽象堆栈、顺序栈、链栈以及堆栈在数制转换中的应用。如果你想进一步了解堆栈相关的资源和知识点,以下是一些可能有帮助的链接:

  1. 堆栈的概念和基本原理:

  2. C++ 模板类及虚函数的使用:

  3. 顺序栈的实现:

  4. 链栈的实现:

  5. 堆栈在数制转换中的应用:

  6. 其他相关资源:

请注意,链接的内容可能会有更新,建议查看最新的文档和教程。希望这些资源对你深入理解堆栈及其在C/C++中的应用有所帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/970359
推荐阅读
相关标签
  

闽ICP备14008679号