当前位置:首页C++程序设计 > 正文

C++线性表中的栈

作者:野牛程序员:2023-02-24 20:00:06C++程序设计阅读 2584

在C++中,栈(Stack)是一种常见的线性数据结构,用于存储和管理数据。它的特点是先进后出,即最后入栈的元素会最先出栈。

下面是C++中使用数组实现栈的示例代码:

#include <iostream>
using namespace std;

#define MAX_SIZE 100 // 栈的最大容量

class Stack {
private:
  int arr[MAX_SIZE]; // 存储栈中元素的数组
  int top; // 栈顶指针,指向栈顶元素的下一个位置

public:
  Stack() {
    top = 0;
  }

  bool isEmpty() {
    return top == 0;
  }

  bool isFull() {
    return top == MAX_SIZE;
  }

  void push(int value) {
    if (isFull()) {
      cout << "Stack overflow!" << endl;
      return;
    }
    arr[top++] = value;
  }

  int pop() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    return arr[--top];
  }

  int peek() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    return arr[top-1];
  }
};

int main() {
  Stack s;

  s.push(1);
  s.push(2);
  s.push(3);

  cout << s.pop() << endl; // 输出 3
  cout << s.pop() << endl; // 输出 2
  cout << s.peek() << endl; // 输出 1

  return 0;
}

在上面的示例代码中,我们定义了一个Stack类,该类包含一个整型数组arr和一个整型变量top。其中,arr用于存储栈中的元素,top指向栈顶元素的下一个位置。

Stack类包含了几个常用的方法,包括isEmpty()isFull()push()pop()peek()。其中,isEmpty()isFull()方法用于判断栈是否为空和是否已满;push()方法用于将元素压入栈中;pop()方法用于弹出栈顶元素并返回其值;peek()方法用于返回栈顶元素的值但不弹出。

main()函数中,我们首先创建了一个Stack对象s,然后向其中压入了三个元素。接着,我们依次弹出了栈顶的两个元素,并使用peek()方法查看了栈顶元素的值。

除了使用数组实现栈,C++中还可以使用链表来实现栈。下面是使用链表实现栈的示例代码:

#include <iostream>
using namespace std;

class Node {
public:
  int value;
  Node* next;
  Node(int v) {
    value = v;
    next = nullptr;
  }
};

class Stack {
private:
  Node* top; // 栈顶指针,指向栈顶元素

public:
  Stack() {
    top = nullptr;
  }

  bool isEmpty() {
    return top == nullptr;
  }

  void push(int value) {
    Node* newNode = new Node(value);
    newNode->next = top;
    top = newNode;
  }

  int pop() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    Node* nodeToPop = top;
    int value = nodeToPop->value;
    top = top->next;
    delete nodeToPop;
    return value;
  }

  int peek() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    return top->value;
  }
};

int main() {
  Stack s;

  s.push(1);
  s.push(2);
  s.push(3);

  cout << s.pop() << endl; // 输出 3
  cout << s.pop() << endl; // 输出 2
  cout << s.peek() << endl; // 输出 1

  return 0;
}

在上面的示例代码中,我们定义了一个Node类和一个Stack类。Node类表示栈中的元素,包含一个整型变量value和一个指向下一个节点的指针nextStack类包含一个指向栈顶元素的指针top

Stack类包含了几个常用的方法,包括isEmpty()push()pop()peek()。其中,isEmpty()方法用于判断栈是否为空;push()方法用于将元素压入栈中;pop()方法用于弹出栈顶元素并返回其值;peek()方法用于返回栈顶元素的值但不弹出。

main()函数中,我们首先创建了一个Stack对象s,然后向其中压入了三个元素。接着,我们依次弹出了栈顶的两个元素,并使用peek()方法查看了栈顶元素的值。与使用数组实现栈不同,使用链表实现栈可以动态地添加或删除元素,而不需要预先指定栈的大小。

另外,使用链表实现栈的时候,需要注意内存管理的问题。在压入元素时,需要动态分配内存并将新节点的next指针指向当前的栈顶节点;在弹出元素时,需要删除被弹出的节点并将栈顶指针指向下一个节点。如果不注意内存管理,就可能会出现内存泄漏或者访问已释放的内存的情况。

在实际开发中,可以使用智能指针等工具来辅助管理内存,避免出现内存泄漏等问题。下面是使用智能指针实现链表栈的示例代码:

#include <iostream>
#include <memory>
using namespace std;

class Node {
public:
  int value;
  shared_ptr<Node> next;
  Node(int v) {
    value = v;
    next = nullptr;
  }
};

class Stack {
private:
  shared_ptr<Node> top;

public:
  Stack() {
    top = nullptr;
  }

  bool isEmpty() {
    return top == nullptr;
  }

  void push(int value) {
    shared_ptr<Node> newNode = make_shared<Node>(value);
    newNode->next = top;
    top = newNode;
  }

  int pop() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    shared_ptr<Node> nodeToPop = top;
    int value = nodeToPop->value;
    top = top->next;
    return value;
  }

  int peek() {
    if (isEmpty()) {
      cout << "Stack underflow!" << endl;
      return -1;
    }
    return top->value;
  }
};

int main() {
  Stack s;

  s.push(1);
  s.push(2);
  s.push(3);

  cout << s.pop() << endl; // 输出 3
  cout << s.pop() << endl; // 输出 2
  cout << s.peek() << endl; // 输出 1

  return 0;
}

在这个示例代码中,我们使用了std::shared_ptr智能指针来管理节点的内存。当一个节点不再被栈所引用时,智能指针会自动将其释放。这样可以避免手动管理内存时的繁琐和容易出错的问题,提高代码的可维护性。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击