C++ 学习 2024.9.3

封装栈与队列

栈:

cpp 复制代码
#include <iostream>

using namespace std;

class Stack
{
private:
    int *a;      //动态数组存储元素
    int size;    //栈容量
    int top;   //栈顶元素索引
public:
    //有参构造
    Stack(int size):size(size),top(-1)
    {
        a=new int[size];
    }
    //析构
    ~Stack()
    {
        delete[]a;
    }
    //判空
    bool empty()
    {
        return top==-1;
    }
    //入栈
    void push_in(int const &e)
    {
        if(top+1==size)  //二倍扩容
        {
            int *newa=new int[size*2];
            for(int i=0;i<size;++i)
            {
                newa[i]=a[i];
            }
            delete[]a;
            a=newa;
            size*=2;
        }
        a[++top]=e;
    }
    //出栈
    void pop()
    {
        if(empty())
        {
            cout<<"栈为空,出栈失败"<<endl;
        }
        else
        {
            --top;
        }
    }
    //栈内元素个数
    int size_1()
    {
        if(empty())  //栈空
        {
            return 0;
        }
        return top+1;
    }
    //访问栈顶元素
    void at_top()
    {
        if(!empty())
        {
            cout<<"栈顶元素为:"<<a[top]<<endl;
        }
        else
        {
            cout<<"栈为空"<<endl;
        }
    }
    //展示函数
    void show()
    {
        cout<<"栈内元素为"<<endl;
        for(int i=0;i<=top;i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
};

int main()
{
    Stack s(10);
    s.push_in(5);
    s.push_in(2);
    s.push_in(0);
    s.show();             //5 2 0
    int count=s.size_1();
    cout<<"栈内元素个数为:"<<count<<endl;
    s.push_in(9); 
    s.show();           //5 2 0 9
    s.pop();
    cout<<"执行一次pop函数后"<<endl;
    s.show();          //5 2 0
    s.at_top();   //访问栈顶元素
    s.pop();
    s.pop();
    s.pop();   //此时栈为空
    s.pop();
    return 0;
}

队列:

cpp 复制代码
#include <iostream>

using namespace std;
int count=0;
class Queue
{
private:
    int *a;     //动态数组存储
    int size;    //队列容量
    int front;   //队头元素索引
    int last;  //队尾元素索引
public:
    //有惨构造
    Queue(int size):size(size),front(0),last(0)
    {
        a=new int[size];
    }
    //析构函数
    ~Queue()
    {
        delete []a;
    }
    //判空
    bool empty()
    {
        return front==last;
    }

    //访问队头元素
    void at_front()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
        }
        else
        {
            cout<<"队头元素为:"<<a[front]<<endl;
        }
    }
    //访问队尾元素
    void at_last()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
        }
        else
        {
            cout<<"队尾元素为:"<<a[(last+size-1)&size]<<endl;
        }
    }
    //队列中元素个数
    int size_1()
    {
        if(empty())  //栈空
        {
            return 0;
        }
        return last-front;
    }
    //向队尾插入元素
    void push_in(int const &e)
    {
        if((last+1)%size==front)   //二倍扩容
        {
            int *newa=new int[size*2];
            for(int i=0;i<size;++i)
            {
                newa[i]=a[(front+i)&size];
            }
            delete []a;
            a=newa;
            size*=2;
            front=0;
            last=size/2;
        }
        a[last]=e;
        last=(last+1)%size;
        count++;
    }
    //删除首个元素
    void pop()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
        }
        else
        {
            front++;
            front%=size;

        }
    }
    //展示函数
    void show()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
        }
        else
        {
            cout<<"队列中元素为:"<<"";
            for(int i=front;i<count;i++)
            {
                cout<<a[i]<<" ";
            }
            cout<<endl;
        }
    }
};

int main()
{
    Queue q(10);
    q.push_in(1);
    q.push_in(3);
    q.push_in(1);
    q.push_in(4);
    q.show();       //1 3 1 4
    int haha=q.size_1();
    cout<<"队列中元素个数为:"<<haha<<endl;   //4
    q.pop();
    cout<<"执行一次pop函数后"<<endl;
    q.show();  //3 1 4
    q.at_front();
    q.at_last();    //访问队尾元素一直显示0  抓耳挠腮仍无法解决
    return 0;
}
相关推荐
利刃大大3 分钟前
【c++中间件】Elasticsearch介绍与安装 && 核心概念 && Kibana && 二次封装
c++·elasticsearch·中间件
这张生成的图像能检测吗16 分钟前
(论文速读)多任务深度学习框架下基于Lamb波的多损伤数据集构建与量化算法
人工智能·深度学习·算法·数据集·结构健康监测
wdfk_prog19 分钟前
[Linux]学习笔记系列 -- [kernel]sysctl
linux·笔记·学习
专注于大数据技术栈1 小时前
java学习--==和equals
java·python·学习
艾莉丝努力练剑1 小时前
【C++:哈希表】从哈希冲突到负载因子:熟悉哈希表的核心机制
开发语言·c++·stl·散列表·哈希表·哈希·映射
虾..1 小时前
C++ 特殊类的设计
开发语言·c++
晨非辰3 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
小曹要微笑3 小时前
STM32H7系列全面解析:嵌入式性能的巅峰之作
c语言·stm32·单片机·嵌入式硬件·算法
寻星探路3 小时前
JavaSE重点总结后篇
java·开发语言·算法
残影飞雪4 小时前
Jetson版本下Pytorch和torchvision
c++