zoukankan      html  css  js  c++  java
  • 栈C++实现

    栈的核心是LIFO(Last In First Out),即后进先出

    出栈和入栈只会对栈顶进行操作,栈底永远为0。如果是入栈,要将入栈元素赋值给栈数组,再将栈顶上移一位;出栈时要先将栈顶下移一位,再将栈顶元素赋值给引用

    源代码:https://github.com/cjy513203427/C_Program_Base/tree/master/52.%E6%A0%88

    需要实现的方法如下

    #pragma once
    #ifndef MYSTACK_H
    #define MYSTACK_H
    
    #include<iostream>
    using namespace std;
    
    class MyStack 
    {
    public:
        MyStack(int size);//分配内存初始化栈空间,设定栈容量,栈顶
        ~MyStack();//回收栈空间内存
        bool stackEmpty();//判断栈是否为空
        bool stackFull();//判断栈是否为满
        void clearStack();//清空栈
        int stackLength();//已有元素的个数
        bool push(char elem);//元素入栈,栈顶上升
        bool pop(char &elem);//元素入栈,栈顶下降
        void stackTraverse(bool isAsc);//遍历栈中所有元素
    private:
        char *m_pBuffer;//栈空间指针
        int m_iSize;//栈容量
        int m_iTop;//栈顶,栈中元素个数
    };
    
    #endif // !MYSTACK_H

    1.构造函数

    传入数组容量赋值给成员变量m_iSize

    声明一个指针,指向数组

    栈顶初始化为0

    MyStack::MyStack(int size)
    {
        m_iSize = size;
        m_pBuffer = new char[m_iSize];
        m_iTop = 0;
    }

    2.析构函数

    删除数组指针并置空

    MyStack::~MyStack()
    {
        delete[]m_pBuffer;
        m_pBuffer = NULL;
    }

    3.判空与判满

    m_iTop就是栈的长度,当m_iTop为0是栈为空

    m_iTop=容量时栈为满

    bool MyStack::stackEmpty()
    {
        return 0 == m_iTop ? true : false;//0 == m_iSize这样的写法,编译器更敏感,防止一个“=”的错误不报
    }
    
    bool MyStack::stackFull()
    {
        return m_iTop == m_iSize ? true : false;
    }

    4.清空栈

    将栈顶指针置空

    void MyStack::clearStack()
    {
        m_iTop = 0;
    }

    5.获取栈长度

    int MyStack::stackLength()
    {
        return m_iTop;
    }

    6.入栈

    如果栈为满,则不允许入栈

    如果栈未满,将参数赋值给数组[栈顶],再将m_iTop上移一位,

    返回正确结果

    bool MyStack::push(char elem)
    {
        if (stackFull()) {
            return false;
        }
        else {
            m_pBuffer[m_iTop] = elem;
            m_iTop++;
            return true;
        }
    }

    7.出栈

     传入引用作为“返回值”使用,仅仅为了测试获取出栈的元素

    如果栈为空,不允许出栈

    如果栈不为空,先将m_iTop下移一位,因为经过入栈操作才能进行出栈操作,入栈操作已经将m_iTop上移一位,此时数组[栈顶]是一个空值,栈顶指向的元素为空

    再将数组[栈顶]赋值给引用变量elem,返回正确结果

    PS:这里要注意,在队列里面使用队首front和队尾rear不用考虑先+后+的问题,都是后+,先+会导致队首或者队尾指向的元素为空

    bool MyStack::pop(char &elem)
    {
        if (stackEmpty())
        {
            return false;
        }
        else {
            //先做--操作,因为入栈m_iTop++,m_iTop指向了一个空的区域
            m_iTop--;
            elem = m_pBuffer[m_iTop];
            return true;
        }
    }

    8.遍历

    根据isAsc判断是正序还是倒序遍历

    void MyStack::stackTraverse(bool isAsc)
    {
    	if (isAsc) {
    		for (int i = 0; i < m_iTop; i++)
    		{
    			cout << m_pBuffer[i] << ",";
    		}
    	}
    	else {
    		for (int i = m_iTop - 1; i >= 0; i--)
    		{
    			cout << m_pBuffer[i] << ",";
    		}
    	}
    }
    
  • 相关阅读:
    常见的排序算法(四):归并排序
    常见的排序算法(三):快速排序
    常见的排序算法(二):选择排序
    a标签没有闭合引起自动插入很多a标签的问题
    js笔记
    Vue笔记
    CSS笔记
    bootstrap--网格化布局
    backgroud图片充满元素的方法
    bootstrap--概述
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9391276.html
Copyright © 2011-2022 走看看