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;
}
相关推荐
kyle~16 小时前
排序---常用排序算法汇总
数据结构·算法·排序算法
赖small强16 小时前
【Linux C/C++开发】Linux 平台 Stack Protector 机制深度解析
linux·c语言·c++·stack protector·stack-protector·金丝雀机制
Wild_Pointer.16 小时前
环境配置指南:全景目录
c++
AndrewHZ16 小时前
【遥感图像入门】DEM数据处理核心算法与Python实操指南
图像处理·python·算法·dem·高程数据·遥感图像·差值算法
CoderYanger16 小时前
动态规划算法-子序列问题(数组中不连续的一段):28.摆动序列
java·算法·leetcode·动态规划·1024程序员节
有时间要学习16 小时前
面试150——第二周
数据结构·算法·leetcode
疋瓞17 小时前
C++_win_QT6学习《3》_结合qt项目开发学习git仓库相关知识
c++·qt·学习
liu****17 小时前
3.链表讲解
c语言·开发语言·数据结构·算法·链表
minji...17 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
第二只羽毛17 小时前
C++ 高性能编程要点
大数据·开发语言·c++·算法