【每日算法】AB2 栈的压入、弹出序列

简介: AB2 栈的压入、弹出序列

一、问题描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

  1. 0<=pushV.length == popV.length <=1000
  2. -1000<=pushV[i]<=1000
  3. pushV 的所有数字均不相同

示例

输入:
[1,2,3,4,5],[4,5,3,2,1]
复制
返回值:
true
复制
说明:
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true

二、代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param pushV int整型一维数组
 * @param pushVLen int pushV数组长度
 * @param popV int整型一维数组
 * @param popVLen int popV数组长度
 * @return bool布尔型
 */
struct stack {
    int top;
    int data[1001];
} stack;

void init(struct stack *sk) {
    sk->top = 0;
}

void push(struct stack *sk, int a) {
    sk->data[sk->top] = a;
    sk->top ++;
}

int pop(struct stack *sk) {
    sk->top --;
    return sk->data[sk->top];
}

int top(struct stack *sk) {
    return sk->data[sk->top - 1];
}

bool isempty(struct stack *sk) {
    if (sk->top == 0)
        return true;
    else
        return false;
}

bool instack(struct stack *sk, int a) {
    for (int i = 0; i < sk->top; i ++) {
        if (sk->data[i] == a)
            return true;
    }
    return false;
}


bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
    struct stack sk;
    init(&sk);
    int push_p = 0; // 指向pushV中尚未入栈的第一个数
    int pop_left = popVLen;
    push(&sk, pushV[push_p]);
    printf("push %d\n", pushV[sk.top - 1]);
    push_p ++;
    while (1) {
        for (int i = 0; i < popVLen; i ++) {
            printf("popV[i] %d\n", popV[i]);
            // 该数在栈中,则进行出栈操作
            if (instack(&sk, popV[i])) {
                printf("in stack\n");
                while (1) {
                    printf("pop %d\n", top(&sk));
                    pop_left --;
                    if (pop(&sk) == popV[i]) { 
                        break;
                    }
                }
                if((sk.top == 0) && (push_p != pushVLen)){
                    push(&sk, pushV[push_p]);
                    push_p ++;
                }
            }
            // 该数不在栈中,则进行入栈操作
            else {
                printf("not in stack\n");
                if(push_p == pushVLen){
                    return false;
                }
                while (sk.data[sk.top - 1] != popV[i]) {
                    push(&sk, pushV[push_p]);
                    printf("[push %d]\n", pushV[push_p]);
                    push_p ++;
                    if ((push_p == pushVLen) && (sk.data[sk.top - 1] != popV[i])) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

三、算法思路

  1. 循环遍历popV数组中的每一个数,对于每一个数a有两种情况:

①不在栈中:那么将pushV数组中的数依次push进栈中,直到push的数和a相等
②在栈中:那么对栈进行pop操作,直到pop的数等于a

  1. 若pushV中所有数据都已经入过栈并且popV中数据还没遍历完,说明popV中有不存在于pushV的数,返回false
  2. 若popV中全部数据都遍历完成,返回true

四、遇到的问题

  1. 数组越界:在循环判断栈顶数据是否等于popV[i]时,会出现此时栈为空的情况,那么此时sk[-1]初始化为0,当popV[i]正好为0时,会判断失误。

解决: 在pop后判断栈是否为空,若为空则push;或者改成while(1),在while里判断并push

  1. 未及时判断pushV中的数是否已经全部入过栈,导致大量奇怪的数入栈
目录
相关文章
|
机器学习/深度学习 算法 数据挖掘
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本内容包含基于BiLSTM与遗传算法(GA)的算法介绍及实现。算法通过MATLAB2022a/2024b运行,核心为优化BiLSTM超参数(如学习率、神经元数量),提升预测性能。LSTM解决传统RNN梯度问题,捕捉长期依赖;BiLSTM双向处理序列,融合前文后文信息,适合全局信息任务。附完整代码(含注释)、操作视频及无水印运行效果预览,适用于股票预测等场景,精度优于单向LSTM。
|
11月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
|
算法 数据安全/隐私保护
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
本项目实现了一种基于Logistic Map混沌序列的数字信息加解密算法,使用MATLAB2022A开发并包含GUI操作界面。支持对文字、灰度图像、彩色图像和语音信号进行加密与解密处理。核心程序通过调整Logistic Map的参数生成伪随机密钥序列,确保加密的安全性。混沌系统的不可预测性和对初值的敏感依赖性是该算法的核心优势。示例展示了彩色图像、灰度图像、语音信号及文字信息的加解密效果,运行结果清晰准确,且完整程序输出无水印。
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
|
算法 数据安全/隐私保护
基于混沌序列和小波变换层次化编码的遥感图像加密算法matlab仿真
本项目实现了一种基于小波变换层次化编码的遥感图像加密算法,并通过MATLAB2022A进行仿真测试。算法对遥感图像进行小波变换后,利用Logistic混沌映射分别对LL、LH、HL和HH子带加密,完成图像的置乱与扩散处理。核心程序展示了图像灰度化、加密及直方图分析过程,最终验证加密图像的相关性、熵和解密后图像质量等性能指标。通过实验结果(附图展示),证明了该算法在图像安全性与可恢复性方面的有效性。
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
597 80
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于Matlab 2022a/2024b实现,结合灰狼优化(GWO)算法与双向长短期记忆网络(BiLSTM),用于序列预测任务。核心代码包含数据预处理、种群初始化、适应度计算及参数优化等步骤,完整版附带中文注释与操作视频。BiLSTM通过前向与后向处理捕捉序列上下文信息,GWO优化其参数以提升预测性能。效果图展示训练过程与预测结果,适用于气象、交通等领域。LSTM结构含输入门、遗忘门与输出门,解决传统RNN梯度问题,而BiLSTM进一步增强上下文理解能力。
|
机器学习/深度学习 算法 数据安全/隐私保护
基于模糊神经网络的金融序列预测算法matlab仿真
本程序为基于模糊神经网络的金融序列预测算法MATLAB仿真,适用于非线性、不确定性金融数据预测。通过MAD、RSI、KD等指标实现序列预测与收益分析,运行环境为MATLAB2022A,完整程序无水印。算法结合模糊逻辑与神经网络技术,包含输入层、模糊化层、规则层等结构,可有效处理金融市场中的复杂关系,助力投资者制定交易策略。
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
257 14

热门文章

最新文章