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;
}
相关推荐
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
世人万千丶1 天前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
yuzhuanhei1 天前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
此刻觐神1 天前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习
憧憬从前1 天前
算法学习记录DAY2
学习
2401_892070981 天前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象