C++ 如何实现顺序栈(使用模板类)

C++如何实现顺序栈(使用模板类)

什么是顺序栈?

顺序栈是一种使用数组存储数据的栈。在顺序栈中,栈顶指针指向存储栈顶元素的位置,栈顶指针的下标为 0 时表示栈为空。

如何实现顺序栈?

1.定义模板类

顺序栈可以通过 C++ 中的模板类来实现,这样可以使其具备更好的可扩展性和复用性。下面是一个使用模板类实现顺序栈的示例代码:

template <class T>
class SequenceStack {
public:
    SequenceStack() {}
    ~SequenceStack() {}
    bool isEmpty() const { return top == -1; }
    bool isFull() const { return top + 1 == maxsize; }
    int getLength() const { return top + 1; }
    void push(const T& item);
    T pop();
    T getTop() const;
private:
    enum { maxsize = 100 };
    T data[maxsize];
    int top = -1;
};

这里定义了一个名为 SequenceStack 的模板类,其模板参数为 T。SequenceStack 存储了一个 T 类型的数组 data,数组的最大长度为 maxsize。top 表示当前栈顶元素的下标,初始值为 -1,当 top = -1 时表示栈为空。

2.push 函数实现

下面是 push 函数的代码实现:

template <class T>
void SequenceStack<T>::push(const T& item) {
    if (isFull()) {
        throw std::overflow_error("SequenceStack is full");
    }
    data[++top] = item;
}

如果栈已经满了,就抛出一个 std::overflow_error,否则将新元素插入到 data[top+1] 位置,然后将 top 的值加 1。

3.pop 函数实现

下面是 pop 函数的代码实现:

template <class T>
T SequenceStack<T>::pop() {
    if (isEmpty()) {
        throw std::underflow_error("SequenceStack is empty");
    }
    return data[top--];
}

如果栈已经为空,就抛出一个 std::underflow_error,在否则将 top 指针指向下一个元素,然后返回栈顶元素的值。

4.getTop 函数实现

下面是 getTop 函数的代码实现:

template <class T>
T SequenceStack<T>::getTop() const {
    if (isEmpty()) {
        throw std::underflow_error("SequenceStack is empty");
    }
    return data[top];
}

如果栈已经为空,就抛出一个 std::underflow_error,在否则返回栈顶元素的值。

示例代码

示例 1:顺序栈的基本操作

我们可以使用下面的代码来测试 SequenceStack 类的基本操作:

#include <iostream>
#include "SequenceStack.hpp"

int main() {
    SequenceStack<int> stack;
    std::cout << "isEmpty? " << stack.isEmpty() << std::endl;
    std::cout << "push 1" << std::endl;
    stack.push(1);
    std::cout << "get top item: " << stack.getTop() << std::endl;
    std::cout << "push 2, 3, 4" << std::endl;
    stack.push(2);
    stack.push(3);
    stack.push(4);
    std::cout << "pop item: " << stack.pop() << std::endl;
    std::cout << "get top item: " << stack.getTop() << std::endl;
    std::cout << "push 5, 6, 7, 8, 9, 10" << std::endl;
    for (int i = 5; i <= 10; ++i) {
        stack.push(i);
    }
    std::cout << "isFull? " << stack.isFull() << std::endl;
    std::cout << "get length: " << stack.getLength() << std::endl;
    std::cout << "pop all items: ";
    while (!stack.isEmpty()) {
        std::cout << stack.pop() << " ";
    }
    std::cout << std::endl;
    return 0;
}

输出结果:

isEmpty? 1
push 1
get top item: 1
push 2, 3, 4
pop item: 4
get top item: 3
push 5, 6, 7, 8, 9, 10
isFull? 1
get length: 10
pop all items: 10 9 8 7 6 5 3 2 1 

示例2:计算表达式中的数值

我们可以使用下面的代码来测试 SequenceStack 类在处理表达式时的功能:

#include <iostream>
#include <string>
#include "SequenceStack.hpp"

int evaluateExpression(const std::string& expr) {
    SequenceStack<int> stack;
    for (auto c : expr) {
        if (isdigit(c)) {
            stack.push(c - '0');
        } else {
            int r = stack.pop();
            int l = stack.pop();
            if (c == '+') {
                stack.push(l + r);
            } else if (c == '-') {
                stack.push(l - r);
            } else if (c == '*') {
                stack.push(l * r);
            } else if (c == '/') {
                stack.push(l / r);
            }
        }
    }
    return stack.pop();
}

int main() {
    std::string expr = "2 3 + 4 * 15 -";
    std::cout << "calculate expression " << expr << std::endl;
    std::cout << "result: " << evaluateExpression(expr) << std::endl;
    return 0;
}

输出结果:

calculate expression 2 3 + 4 * 15 -
result: -59

这段代码演示了如何使用 SequenceStack 类来处理后缀表达式,并计算出表达式的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 如何实现顺序栈(使用模板类) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现航班管理系统

    C语言实现航班管理系统 简介 航班管理系统是一个能够记录航班信息并对其进行管理的软件程序。它可以记录航班的基本信息,如航班号、起飞地、目的地、起飞时间、到达时间、机型等,并提供相应的查询、修改、删除等功能。在本篇文章中,我们将使用C语言创建一个简单的航班管理系统。 步骤 步骤1: 创建一个结构体来保存航班信息 首先,我们需要创建一个结构体来存储航班信息。每一…

    C 2023年5月22日
    00
  • C语言解数独程序的源码

    让我们来详细讲解一下“C语言解数独程序的源码”的完整攻略。 什么是数独? 在介绍程序之前,我们先来了解一下数独。 数独是一种智力游戏,由9×9的方格组成,分成9个3×3的小方格,在已知数的基础上填上未知的数字,使得每一行、每一列和每一个小方格内的数字均为1~9,且不重复。数独不但能训练大脑的逻辑、思维能力,还能减轻压力、增加乐趣。 源码分析 下面,我们来分析…

    C 2023年5月23日
    00
  • 一篇文章了解c++中的new和delete

    一篇文章了解C++中的new和delete 什么是new和delete 在C++中,当我们需要动态地分配内存,即在程序运行时才能确定需要分配的内存大小时,我们可以使用new和delete关键字来完成内存的申请和释放操作。 new关键字用于在堆上分配内存,而delete关键字则用于释放该内存。 new的使用方法 new的语法格式为: 指针变量 = new 数据…

    C 2023年5月23日
    00
  • C标准库 assert.h

    assert.h 是C标准库中的一个头文件,该文件定义了一组标准的宏用来检测程序中的逻辑错误。assert.h 的使用可以极大地方便程序的开发与调试,下面我们就来详细讲解 assert.h 的完整使用攻略。 assert.h 的引入 在需要使用 assert.h 的源文件开头处,可以使用以下代码进行引入: #include <assert.h> …

    C 2023年5月10日
    00
  • VS Code 中安装运行、编写C语言程序的详细教程

    以下是在 VS Code 中安装运行、编写 C 语言程序的详细教程: 1. 安装 VS Code 首先,你需要在官网 https://code.visualstudio.com/上下载并安装 VS Code。 2. 安装 C/C++ 扩展 打开 VS Code,并按下快捷键 Ctrl + Shift + X 或者点击左侧的 Extensions 图标 在搜索…

    C 2023年5月23日
    00
  • 在HTML5中使用MathML数学公式的简单讲解

    下面是HTML5中使用MathML数学公式的简单讲解: 什么是MathML MathML全称是Mathematical Markup Language,是用于在Web上显示数学公式的一种标记语言。MathML是XML的扩展,可以通过在HTML或XML文档中嵌入MathML代码来呈现数学公式。 如何使用MathML 需要指定DOCTYPE 为了使用MathML…

    C 2023年5月23日
    00
  • C++ 程序抛出异常后执行顺序说明

    当一个 C++ 程序在运行过程中遇到了异常情况,它可以通过抛出异常来通知上层代码进行异常处理。在此过程中,C++ 运行时会自动执行一些有序的操作步骤,以保证程序能够正确地处理异常。下面我们就来详细讲解一下这些操作步骤。 C++ 异常抛出和捕获机制 在 C++ 中,我们可以使用 throw 语句来抛出一份异常。其语法形式如下: throw exception_…

    C 2023年5月23日
    00
  • CCleaner磁盘分析器功能如何使用?

    下面是关于“CCleaner磁盘分析器功能如何使用”的详细攻略。 什么是CCleaner磁盘分析器功能? CCleaner是一款系统清理工具,它提供了强大的磁盘分析器功能,帮助用户了解磁盘空间的使用情况。使用CCleaner磁盘分析器,用户可以快速、直观地了解磁盘中各个文件夹占用空间的大小和比例,从而更好地进行磁盘清理和优化。 如何使用CCleaner磁盘分…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部