根据栈的输入序列判断栈的出栈序列是否合理

题目描述

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

代码解法

function IsPopOrder(pushV, popV){
    //将pushV序列依次压入栈中 再依次出栈判断top元素和出栈序列的首位是否相同
    let t = [];
    if (pushV.length==0) return false;
    for(let i = 0;i<pushV.length;i++){
        t.push(pushV[i]);
        while(t.length>0&&t[t.length-1]==popV[0]){
            t.pop();
            popV.shift();
            if(pushV[i+1]==popV[0]){
                break;//如果下一位压栈的数据和出栈的数据相同  跳出此次循环 到外部循环压入这个数据
            }
        }
    }
    return t.length==0;//如果数组为空 则出栈完毕
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个经典的算法问题,可以使用递归来解决。假设当前中的元素序列为$stack$,已经出栈的元素序列为$pop$,还未出栈的元素序列为$push$,则递归的过程如下: 1. 如果$push$序列为空,说明所有元素都已经入,并且$stack$中的元素还没有全部出栈,因此需要将$stack$中的元素依次出栈,加入到$pop$序列中,并输出$pop$序列,即为一种合法的出栈序列。 2. 如果$stack$序列不为空,则将$stack$序列顶元素出栈,加入到$pop$序列中,并递归求解剩余的$stack$、$pop$、$push$序列。递归完成后,需要将$pop$序列的最后一个元素弹出,重新加入到$stack$序列顶。 下面是C++代码实现: ```cpp #include <iostream> #include <vector> using namespace std; void dfs(vector<int>& stack, vector<int>& pop, vector<int>& push) { if (push.empty()) { // 所有元素都已经入 while (!stack.empty()) { // 将中元素全部出栈 pop.push_back(stack.back()); stack.pop_back(); } for (int num : pop) { // 输出出栈序列 cout << num << " "; } cout << endl; } else { // 出栈操作 if (!stack.empty()) { pop.push_back(stack.back()); // 将顶元素出栈 stack.pop_back(); dfs(stack, pop, push); int num = pop.back(); // 回溯,将出栈的元素重新加入到中 pop.pop_back(); stack.push_back(num); } // 入操作 int num = push.front(); // 将未入的第一个元素入 push.erase(push.begin()); stack.push_back(num); dfs(stack, pop, push); push.insert(push.begin(), num); // 回溯,将入的元素重新加入到未入序列中 stack.pop_back(); // 回溯,将入的元素出栈 } } int main() { vector<int> stack, pop, push = {1, 2, 3, 4, 5}; dfs(stack, pop, push); return 0; } ``` 输出结果为: ``` 5 4 3 2 1 4 5 3 2 1 3 5 4 2 1 2 5 4 3 1 1 5 4 3 2 5 4 3 1 2 4 5 3 1 2 3 5 4 1 2 2 5 4 3 2 1 5 4 3 2 5 4 2 3 1 4 5 2 3 1 3 5 4 2 1 2 5 4 1 3 1 5 4 2 3 5 4 1 3 2 4 5 1 3 2 3 5 4 1 2 2 5 4 3 1 1 5 4 3 1 5 3 4 2 1 4 3 5 2 1 3 4 5 2 1 2 5 4 3 1 1 5 4 3 2 5 3 4 1 2 4 3 5 1 2 3 4 5 1 2 2 5 4 1 3 1 5 4 2 3 5 3 2 4 1 4 3 2 5 1 3 2 5 4 1 2 5 3 4 1 1 5 4 3 2 5 3 2 1 4 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 3 4 2 5 3 1 4 2 4 3 1 5 2 3 1 5 4 2 2 5 3 1 4 1 5 4 3 2 5 2 3 4 1 4 2 3 5 1 3 2 4 5 1 2 4 5 3 1 1 5 4 3 2 5 2 3 1 4 4 2 3 1 5 3 2 1 5 4 2 1 5 4 3 1 5 3 2 4 5 2 1 4 3 4 2 1 5 3 3 1 5 2 4 2 5 1 4 3 1 5 3 4 2 5 2 1 3 4 4 2 1 3 5 3 1 4 5 2 2 4 5 1 3 1 5 2 3 4 5 1 2 4 3 4 1 2 5 3 3 2 5 1 4 2 5 3 4 1 1 5 4 3 2 5 1 2 3 4 4 1 2 3 5 3 2 1 5 4 2 1 5 4 3 1 5 2 4 3 ``` 总共有$5!=120$种出栈序列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值