StaticStack

1 栈的顺序实现

1.1 示意图

在这里插入图片描述

1.2 StaticStack设计要点

类模板:

  • 使用原生数组作为栈的存储空间。
  • 使用模板参数决定栈的最大容量。

1.3 继承关系图

在这里插入图片描述

1.4 接口实现

在这里插入图片描述


2 代码实现

StaticStack.h

#ifndef STATICSTACK_H
#define STATICSTACK_H

#include "Stack.h"
#include "Exception.h"

namespace LemonLib {
template <typename T, int N>
class StaticStack : public Stack<T>
{
protected:
    T m_sapce[N];
    int m_top;
    int m_size;

public:
    StaticStack()
    {
        m_top = -1;
        m_size = 0;
    }

    void push(const T& e)
    {
        if (m_size < N)
        {
            m_sapce[m_top + 1] = e; //之所以这里不直接m_space++是为了异常安全,防止赋值的过程中出现异常
            m_top++;
            m_size++;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "No space in current stack...");
        }
    }

    int capacity() const
    {
        return N;
    }

    void pop()
    {
        if (m_size > 0)
        {
            m_top--;
            m_size--;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "No element in current stack...");
        }
    }

    T top() const
    {
        if (m_size > 0)
        {
            return m_sapce[m_top];
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "No element in current stack...");
        }
    }

    void clear()
    {
        m_top = -1;
        m_size = 0;
    }

    int size() const
    {
        return m_size;
    }
};
}

#endif // STATICSTACK_H

main.cpp:

#include <iostream>
#include "StaticStack.h"

using namespace std;
using namespace LemonLib;

int main()
{
    StaticStack<int, 5> stack;

    try
    {
        stack.pop();
    }
    catch (const Exception& e)
    {
        cout << e.message() << endl;
        cout << e.location() << endl;
    }


    for (int i=0; i<5; i++)
    {
        stack.push(i);
    }

    while (stack.size())
    {
        cout << stack.top() << endl;
        stack.pop();
    }

    return 0;
}
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
以下是基于给出框架的代码和注释: ``` import java.util.Stack; public class MyStack { static Stack<Integer> stack = new Stack<>(); int start = 1; int num; public MyStack(int num) { this.num = num; } // 补充同步进栈方法 public synchronized boolean push() throws InterruptedException { // 如果栈已满,等待直到有出栈操作 while (stack.size() >= num) { wait(); } // 否则将元素入栈,并通知其他线程可以进行操作 stack.push(start++); notifyAll(); return true; } // 补充同步出栈方法 public synchronized boolean pop() throws InterruptedException { // 如果栈为空,等待直到有进栈操作 while (stack.empty()) { wait(); } // 否则将元素出栈,并通知其他线程可以进行操作 stack.pop(); notifyAll(); return true; } } public class InputStack extends Thread { // 补充进栈类成员变量 MyStack stack; int num; // 补充进栈类构造方法 public InputStack(MyStack stack, int num) { this.stack = stack; this.num = num; } // 补充run()方法(可自行调整休眠时间) public void run() { try { while (num-- > 0) { stack.push(); Thread.sleep((int) (Math.random() * 1000)); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class OutputStack extends Thread { // 补充出栈类成员变量 MyStack stack; int num; // 补充出栈类构造方法 public OutputStack(MyStack stack, int num) { this.stack = stack; this.num = num; } // 补充run()方法(可自行调整休眠时间) public void run() { try { while (num-- > 0) { stack.pop(); Thread.sleep((int) (Math.random() * 1000)); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class StackDemo { public static void main(String[] args) { MyStack stack = new MyStack(20); InputStack input1 = new InputStack(stack, 20); InputStack input2 = new InputStack(stack, 20); OutputStack output1 = new OutputStack(stack, 20); OutputStack output2 = new OutputStack(stack, 20); input1.start(); input2.start(); output1.start(); output2.start(); } } ``` 注:以上代码中,进栈线程类InputStack和出栈线程类OutputStack都继承了Thread类,并重写了run()方法,run()方法中通过调用MyStack类的push()方法和pop()方法来实现进栈和出栈操作,同时也通过Thread.sleep()方法来模拟线程执行的时间消耗。在MyStack类中,push()方法和pop()方法都使用了synchronized关键字来实现同步,以避免多个线程同时对栈进行操作时出现混乱。在push()方法和pop()方法中,使用了wait()方法来阻塞线程,直到有其他线程对栈进行了相反的操作后,才会继续执行,这样可以避免出现栈溢出或栈为空的异常情况。同时,使用了notifyAll()方法来通知其他线程可以进行相反的操作了。最后,在StackDemo类中,创建了2个进栈线程类对象和2个出栈线程类对象,并开启了这些线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值