栈的压入、弹出序列

2018/10/20 Offer 共 1097 字,约 4 分钟

title

problem link

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

solution


import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> stack=new Stack<>();
        int j=0;
        int i=0;
        while (i<popA.length){
            stack.push(pushA[i++]);
            while (j<popA.length&&stack.peek()==popA[j]){
                stack.pop();
                j++;
            }
        }
        return stack.empty();

    }
}

选择题:比它后出栈的如果有比他小的,那么两者之间没有比这个大的

#include <iostream>
#include <string.h>
#include <stack>
using namespace std;

/*
详细描述:   
int JudgeTrainSequence (int maxNum, char *pOutSeq);
输入参数:
        int maxNum:进站的火车最大编号
        char* pOutSeq:使用字符串表示火车出站序列
输出参数(指针指向的内存区域保证有效):
        无。
返回值:
        Int: 根据输入的进站序列判断,如果输入的出战序列是可能的,返回1,否则返回0;

*/

int JudgeTrainSequence (int maxNum, char *pOutSeq){
    if(pOutSeq == NULL || maxNum <= 0){
        return 0;
    }//if
    int size = strlen(pOutSeq);
    stack<int> trainSeq;
    // 初始
    int index = 1;
    for(int i = 0;i < size;){
        if(trainSeq.empty() || trainSeq.top() < pOutSeq[i] - '0'){
            trainSeq.push(index);
            ++index;
        }//if
        else{
            trainSeq.pop();
            ++i;
        }//else
    }//for
    if(!trainSeq.empty()){
        return 0;
    }//if
    return 1;
}

Search

    Table of Contents