C++实现栈与分析栈的知识点

 更新时间:2022年03月11日 10:58:21   作者:机器学习入坑者  
这篇文章主要介绍了C++实现栈与分析栈的知识点,栈(stack)是计算机中常用的一种线性数据结构,经常有资料使用“操作受限”来形容栈,因为它的压入栈和弹出栈操作只能在栈顶进行,下文更多相关资料,需要的小伙伴可以参考一下

一、栈的概念

栈的英文为stack,译为一叠或者一摞。栈是一种采用先进后出FILO(first in last out)或称为后进先出LIFO(last in first out)策略进行元素访问的数据结构。栈经常被比作是一摞碟子,最上面的碟子是最后放上去的,却是最先被拿走的。

二、栈的基本组成和操作

如果要正确的使用栈,则必须保证其含有栈顶指针和栈元素。此外,栈的基本操作含有:

  • 初始化;
  • 入栈;
  • 出栈;
  • 清空栈;
  • 访问栈顶元素;
  • 检测栈的状态;

其中,栈包含三种状态:栈空、一般状态、栈满。检测栈满是非常重要的步骤,防止在栈容量不能扩充时出现溢出现象,此时称为上溢。如果在栈空时进行出栈操作,此时会出现下溢。所以在入栈和出栈时,必须对栈的状态进行检查。

三、栈元素的存储方式

常用的实现方式分为两种;

  • 第一种策略是使用静态数组实现,此时栈的容量是有限的;
  • 第二种策略是使用动态数组或者链表,此时栈的容量可以动态扩充。

四、C++实现静态栈

使用静态数组实现栈结构时,栈底固定不变,栈顶随着压栈和出栈操作进行自加和自减。一般采用整型变量来表示栈顶,压栈时栈顶变量加一,出栈时栈顶变量减一。

(1)栈类的设计

根据前面对栈基本功能和组成的描述,栈类应该包含下述的公有函数成员和私有数据成员。其中currentSize为栈顶指针,用于压栈、入栈、判空、判满等操作;T表示模板参数类型,栈元素为T类型数组,可以在隐式或显式实例化时指定;SIZE表示栈的容量,一旦确定就不能更改。

代码如下:

template <typename T, int SIZE=10>
class Stack {
public:
    bool isEmpty();
    bool isFull();
    void push(const T &data);
    T pop();
    void clear();
    T getTop();
    
private:
    // 栈顶指针
    int currentSize=-1;
    T array[SIZE];
};

(1)isEmpty()判断是否为空

如果栈顶指针值为0,则表示为栈为空,代码如下:

template<typename T, int SIZE>
bool Stack<T, SIZE>::isEmpty() {
    if (currentSize == 0) {return true;}
    else {return false;}
}

(2)isFull()判断是否已满

如果栈顶指针值等于栈的存储容量SIZE时,栈满:

template<typename T, int SIZE>
bool Stack<T, SIZE>::isFull() {
    if (currentSize == SIZE) {return true;}
    else { return false; }
}

(3)push()压栈

将数据压栈时,栈顶指针同步加一;

template<typename T, int SIZE>
void Stack<T, SIZE>::push(const T &data) {
    // 栈顶压入
    currentSize++;
    array[currentSize] = data;
}

(4)pop()出栈

将数据弹出后,栈顶指针需要减一:

template<typename T, int SIZE>
T Stack<T, SIZE>::pop() {
    if(currentSize>=1){return array[currentSize--];}
}

(5)getTop()获取栈顶元素

获取栈顶数据并不需要对栈顶指针进行移动:

template<typename T, int SIZE>
T Stack<T, SIZE>::getTop() {
    return array[currentSize];
}

(6)clear()清空栈

由于采用的是静态数组,所以清空栈时无需进行内存释放,将栈顶指针归零即可:

template<typename T, int SIZE>
void Stack<T, SIZE>::clear() {
    currentSize = -1;
}

到此这篇关于C++实现栈与分析栈的知识点的文章就介绍到这了,更多相关C++栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vs2022 qt环境搭建调试的方法步骤

    vs2022 qt环境搭建调试的方法步骤

    最近net6和vs2022发布,本文就详细的介绍一下vs2022 qt环境搭建调试的方法步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C++实现幸运大抽奖(QT版)

    C++实现幸运大抽奖(QT版)

    这篇文章主要为大家详细介绍了C++实现幸运大抽奖,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Qt编写自定义控件实现抽奖转盘

    Qt编写自定义控件实现抽奖转盘

    这篇文章主要为大家详细介绍了Qt编写自定义控件实现抽奖转盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++编程中私有和保护以及公有的类成员访问控制

    C++编程中私有和保护以及公有的类成员访问控制

    这篇文章主要介绍了C++编程中私有和保护以及公有的类成员访问控制,即private和protected以及public关键字的相关作用和用法,需要的朋友可以参考下
    2016-01-01
  • 从C语言过渡到C++之基本变化

    从C语言过渡到C++之基本变化

    在之前的C++代码训练营系列中,我试图用完成具体项目的方式给大家介绍C++,但后来大家反馈说这样从C过渡到C++有点跟不上。于是我又专门设计了这个《从C到C++》的过渡专题,我准备通过10篇文章介绍一下C++和C的重要区别。
    2017-07-07
  • C++ Opencv自写函数实现膨胀腐蚀处理技巧

    C++ Opencv自写函数实现膨胀腐蚀处理技巧

    这篇文章主要介绍了C++ Opencv 自写函数实现膨胀腐蚀处理,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • C语言哈希表概念超详细讲解

    C语言哈希表概念超详细讲解

    哈希是一种很高效的存储数据的结构,它是利用的一种映射关系,它也是STL中unordered_map和unordered_set 的底层结构。本文,主要讲解哈希的原理,哈希的实现,里面关键点在于如何解决哈希冲突
    2023-02-02
  • C++使用redis的实例详解

    C++使用redis的实例详解

    这篇文章主要介绍了C++使用redis的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C++实现基于时序公平的读写锁详解

    C++实现基于时序公平的读写锁详解

    读写锁与普通的互斥锁的区别在于有两种上锁方式:读锁和写锁,不用的用户对同一个读写锁获取读锁是非互斥的,其他情况则是互斥的,本文小编将给大家详细介绍C++实现基于时序公平的读写锁,需要的朋友可以参考下
    2023-10-10
  • C++如何获取当前系统时间及格式化输出

    C++如何获取当前系统时间及格式化输出

    这篇文章主要介绍了C++如何获取当前系统时间及格式化输出的实例代码,主要用到time()及strftime()函数,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论