第三章 栈与队列

顺序栈的简单实现:

#include <stdio.h>
#include <iostream>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define MAXSIZE 20

typedef int Status;
typedef int SElemType;

// 顺序栈的存储结构
typedef struct
{
    SElemType *base; // 栈底指针
    SElemType *top;  // 栈顶指针
    int stacksize;   // 栈可用最大容量
} SqStack;

SqStack S;
bool flag = true;
SElemType e;

//顺序栈的初始化
Status InitSqStack(SqStack &S)
{
    S.base = new SElemType[MAXSIZE]; // 为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if (!S.base)
        exit(OVERFLOW);    // 存储分配失败
    S.top = S.base;        //top初始为base,空栈
    S.stacksize = MAXSIZE; //stacksize置为栈最大容量MAXSIZE
    return OK;
}

// 顺序栈的入栈
Status Push(SqStack &S, SElemType e)
{ //插入元素e为新的栈顶元素
    if (S.top - S.base == S.stacksize)
        return ERROR; // 栈满
    *S.top++ = e;     //元素e压入栈顶,栈顶指针+1
    return OK;
}

// 顺序栈的出栈
Status Pop(SqStack &S, SElemType &e)
{ //删除S的栈顶元素, 用e返回其值
    if (S.top == S.base)
        return ERROR; // 空栈
    // S.top--;
    // e = *S.top;
    e = *--S.top; // 因为top指向栈顶元素的下一个位置,所以要先指向栈顶才能取到正确的栈顶元素
    return OK;
}

// 取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
    if (S.top == S.base)
    {
        printf("这是一个空栈.\n");
        return ERROR;
    }
    return *(S.top - 1); // 栈非空
}

void Show()
{
    while (flag)
    {
        puts("1.初始化顺序栈\n2.入栈\n3.出栈\n4.取栈顶元素\n5.退出\n");
        int choice;
        printf("请输入选择:");
        std::cin >> choice;
        switch (choice)
        {
        case 1:
            InitSqStack(S);
            puts("顺序栈初始化成功.\n");
            break;
        case 2:
            puts("请输入新的栈顶元素e:");
            std::cin >> e;
            if (!Push(S, e))
                puts("入栈fail.\n");
            puts("入栈成功!\n");
            break;
        case 3:

            if (!Pop(S, e))
                printf("栈顶元素出栈失败.\n\n");
            printf("栈顶元素出栈,e = %d\n\n", e);
            break;
        case 4:
            e = GetTop(S);
            printf("栈顶元素e:%d\n\n", e);
            break;
        case 5:
            flag = false;
            if (!S.base)
            {
                delete S.base;
                S.base = NULL;
            }
            break;
        default:
            printf("请重新输入.\n\n");
            break;
        }
    }
}

int main(void)
{
    Show();
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值