数据结构与算法:栈与队列

简介: 数据结构与算法:栈与队列

栈(Stack)


📌 什么是栈 ?

 栈也是一种线性数据结构.

 例如在一个死胡同里, 有5辆汽车(1~5)依次停放, 但当汽车需要倒出时我们发现, 最先进去的汽车1需要等待汽车5~汽车2依次倒出后才能出来;由此我们可以得出栈的特点先进后出(后进先出)

  这里的死胡同其实就相当于我们的栈,汽车就是需要操作的数据,将数据存放到栈中的过程称为入栈(也称压栈push),拿出的过程称为出栈(也称弹栈pop) .

 栈的底部成为栈底,顶部也就是操作数据的入口称为栈顶 .

注意我们操作数据是在栈顶处操作


🎀 创建Stack接口,并实现功能

public interface Stack<T> {
    //压栈
    void push(T ele);
    //弹栈
    T pop();
    //查找栈顶元素
    T peek();
    //是否为空
    boolean isEmpty();
    //栈中元素个数
    int getSize();
}

🎀 创建一个类,对接口中的抽象方法进行重写,将功能具体化

import com.learn.study1.MyArray;
 
public class Arraystack<T> implements Stack<T>{
 
    private MyArray<T> date;
    private int size;
 
    //构造函数(初始化)
    public Arraystack(){
        this.size = 0;
        this.date = new MyArray() ;
    }
 
    @Override
    public void push(T ele) {
        this.date.addTail(ele);
        this.size++;
    }
 
    @Override
    public T pop() {
        if (isEmpty()) {
            throw new IllegalArgumentException("stack is null");
        }
        T ele = this.date.removeTail();
        this.size--;
        return ele;
    }
 
    @Override
    public T peek() {
        if (isEmpty()) {
            throw new IllegalArgumentException("stack is null");
        }
        return this.date.getLastElement();
    }
 
    @Override
    public boolean isEmpty() {
        return this.size==0;
    }
 
    @Override
    public int getSize() {
        return this.size;
    }
    
    @Override
    public String toString() {
        return this.date.toString();
    }
}

✎ 队列(Queue)


📌 什么是队列 ?

• 队列就是排队,例如我们排队打饭,我们从对尾排队,打完饭后从对首离开。

特点:先进先出 FILO(只能从对尾进,对首出)


🎀 创建Queue接口,并实现功能    

public interface Queue<T> {
    //入队
    void offer(T ele);
    //出队
    T poll();
    //判断是否为空
    boolean isEmpty();
    //获取元素个数(长度)
    int getSize();
    //获取对首元素
    T getFront();
}

🎀 创建一个类,对接口中的抽象方法进行重写,将功能具体化                                                      

import com.learn.study1.MyArray;
 
public class ArrayQueue<T> implements Queue<T> {
    //数据容器
    private MyArray<T> date;
    //元素个数
    private int size;
 
    //初始化(构造方法)
    public ArrayQueue() {
        this.size = 0;
        this.date = new MyArray<>(20);
    }
 
    @Override
    public void offer(T ele) {//入队
        this.date.addTail(ele);
        this.size++;
    }
 
    @Override
    public T poll() {//出队
        if (isEmpty()) {
            throw new IllegalArgumentException("queue is empty!");
        }
        T res = this.date.getFirstElement();
        this.size--;
        return res;
    }
 
    @Override
    public boolean isEmpty() {
        return this.size == 0;
    }
 
    @Override
    public int getSize() {
        return this.size;
    }
 
    @Override
    public T getFront() {
        if (isEmpty()) {
            throw new IllegalArgumentException("queue is empty!");
        }
        return this.date.getFirstElement();
    }
}
相关文章
|
2天前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景
|
4天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
12 0
|
5天前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
|
7天前
【海贼王的数据航海】栈和队列
【海贼王的数据航海】栈和队列
6 0
|
3天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
7天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
28 8
|
9天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
1天前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```
|
2天前
|
算法 索引
基于Prony算法的系统参数辨识matlab仿真
Prony算法在MATLAB2022a中用于信号分析,识别复指数信号成分。核心程序通过模拟信号X1,添加不同SNR的噪声,应用Prony方法处理并计算误差。算法基于离散序列的复指数叠加模型,通过构建矩阵并解线性方程组估计参数,实现LTI系统动态特性的辨识。
|
10天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。