包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

import java.util.Stack;

public class Solution {
    Stack num=new Stack<>();//无论如何肯定要保存原始数据
    Stack min=new Stack<>();//随时都能返回min,涉及到状态的变化,用一个栈存,用一个min值对应多个num值,更新则添加,失效则删除
    
    public void push(int node) {
        num.push(node);
        if(min.isEmpty()||node

这个题也可以采用一个min值对应一个num值的做法

public void push(int node) {
        num.push(node);
        if(min.isEmpty()||node

用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

import java.util.Stack;

public class Solution {
    //栈发生变化的地方只有一处,而队列有两处,所以用两个栈来模拟
    Stack stack1 = new Stack();//模拟队列的尾
    Stack stack2 = new Stack();模拟队列的头
    
    public void push(int node) {
        stack1.push(node);//队列和栈一样都是在尾部添加
    }
    
    public int pop() {
        if(stack2.isEmpty())
        {
            while(!stack1.isEmpty())//但是删除的顺序是相反的,所以每次删除时,都要把栈中的数颠倒
                stack2.push(stack1.pop());
        }
        return stack2.pop();
    }
}

栈的压入、弹出序列

题目描述

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

首先是自我感觉良好的弱智算法

import java.util.ArrayList;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        int n=pushA.length;
        int[] rec=new int[n+1];
        for(int i=0;in||popA[i]<1) return false;
            for (int j = i + 1; j < n; j++)
                for (int k = j + 1; k < n; k++)
                    //当i出栈,i前面的数字已经入过栈,如果还没有出栈,他们的顺序都应该跟入栈顺序相反
                   //如果有两个在i之后出栈的数j,k,即是i前面的数字且在i出栈时还没有出栈,出栈顺序却和入栈顺序相同,
                  //那么就是不可能的弹出序列
                    if (rec[popA[j]] < rec[popA[k]] && rec[popA[j]] < rec[popA[i]])
                        return false;
        }
        return true;
    }
}

实际上直接模拟就完事了

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack s=new Stack<>();
        int pos=0;//popA的坐标
        int len=popA.length;
        for(int num:pushA){
            s.push(num);
            //pos越界时,s为空,所以不用判断pos
            while(!s.isEmpty()&&s.peek()==popA[pos])
            {
                s.pop();
                pos++;
            }
        }
        return s.isEmpty();
    }
}

你可能感兴趣的:(栈)