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;
}
相关推荐
编程小白20265 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
学历真的很重要5 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
qq7422349845 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
深蓝海拓5 小时前
PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
笔记·python·qt·学习·pyqt
酒鼎5 小时前
学习笔记(3)HTML5新特性(第2章)
笔记·学习·html5
L***一5 小时前
2026届大专跨境电商专业毕业生就业能力提升路径探析
学习
A尘埃5 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹6 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
ZH15455891316 小时前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
不穿格子的程序员6 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心