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日

相关文章

  • Objective-C Json 实例详解

    Objective-C Json 实例详解 什么是JSON? JSON是一种轻量级的数据交换格式,它是基于JavaScript对象语法的子集,易于人们理解和编写,也易于计算机解析和生成。在近年来的web开发中,JSON已经成为前后端数据交互最常用的格式之一。 使用Objective-C解析JSON 在Objective-C中,解析JSON非常方便,可以使用系…

    C 2023年5月23日
    00
  • C语言和go语言之间的交互操作方法

    C语言和Go语言是两种不同的编程语言,它们在程序的实现上也存在一些差异。但是,由于它们在不同的应用场景下产生了巨大的价值,所以在很多时候是需要将这两种语言进行交互的。那么,如何实现C语言和Go语言的交互呢?下面是一个完整的攻略。 一、Go与C交互的基本方法 Go和C使用的是不同的编译器和标准库,因此它们之间的交互需要一些特殊的技巧。 首先,我们需要了解在Go…

    C 2023年5月23日
    00
  • C++中的const限定符的使用和作用

    C++中的const限定符的使用和作用 为什么需要const? 在编程过程中,我们有时需要将一个变量的值设置为不可修改的,这时就需要使用const关键字。使用const限定符可以有效提高代码的可读性和安全性。 const的基本用法 在C++中,使用const关键字可以定义不可变变量。 const int a = 10; 上述代码定义了一个常量a,它的值为10…

    C 2023年5月22日
    00
  • 深入浅析C/C++ 的条件编译

    下面是“深入浅析C/C++ 的条件编译”的完整攻略。 目录 条件编译的介绍 C/C++ 的条件编译指令 条件编译的使用场合 示例1:利用条件编译实现跨平台编译 示例2:利用条件编译调试代码 条件编译的介绍 条件编译是一种通过在程序中加入条件语句,根据条件来选择编译程序的一部分还是全部程序的一种技术。在C/C++语言中,可以使用条件编译指令来实现条件编译。 在…

    C 2023年5月23日
    00
  • C语言从代码中加载动态链接库过程解析

    C语言从代码中加载动态链接库过程解析 什么是动态链接库 动态链接库,又被称为DLL(动态链接库文件),是一个可被多个应用程序同时使用的代码和数据集合。这些库在程序运行时动态地被加载到内存中,使得程序运行更加高效和节省内存。与之相反的是静态链接库,静态链接库是在编译链接期间就已经被链接到可执行文件中,这种方式可以使得程序更独立且安全,但也会降低程序运行的效率。…

    C 2023年5月23日
    00
  • VC实现Windows多显示器编程的方法

    下面是详细的讲解“VC实现Windows多显示器编程的方法”的完整攻略。 1. 概述 在现代计算机上使用多个显示器已经很常见了,其中在Windows操作系统下实现多显示器编程对于一些需要展示多个窗口或图形界面的应用非常有用处。本文将介绍在VC环境下如何实现Windows多显示器编程。 2. 实现 2.1 函数EnumDisplayDevices 在Windo…

    C 2023年5月23日
    00
  • C++程序操作文件对话框的方法

    现在我将为大家介绍一下在C++程序中操作文件对话框的方法。操作文件对话框是一个常用的功能,它可以帮助我们在程序中以交互式的方式选择文件并进行相关操作。下面是该攻略的详细步骤: 1. 确定操作系统类型 在编写代码之前,我们需要确定我们所使用的操作系统类型,不同的操作系统可能具有不同的文件对话框API接口。下面是Windows和macOS操作系统下涉及到的API…

    C 2023年5月23日
    00
  • JavaScript解构赋值详解

    JavaScript解构赋值详解 JavaScript解构赋值是一种简洁、快速、易读的语法,允许您从数组或对象中提取值并将它们赋值给变量。在本篇文章中,我们将详细探讨解构赋值的语法、使用方法和技巧。 什么是解构赋值? 解构赋值是ES6中的一种语法,它允许我们从数组、对象或函数参数中提取值,并将这些值赋给独立的变量。 对象解构 我们可以使用对象字面量来定义一个…

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