栈与队列专题

1.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

  方法:1.使用两个栈 stackData,stackMin,一个记录数据,另一个栈确保栈顶是当前数据栈的最小元素

     2.入栈:若stackMin空,则直接入,否则如果当前元素小于等于栈顶元素,入栈,否则,不入。

     3.出栈:如果从stackData出来的元素于当前stackMin元素栈顶相同,stackMin进行一次出栈。

private Stack<Integer> stack=new Stack<>();
    private Stack<Integer> min=new Stack<>();
    public void push(int node) {
        stack.push(node);
        if(min.isEmpty()||node<=min.peek())
            min.push(node);
    }
    
    public void pop() {
         int value=stack.pop();
         if(!min.isEmpty()&&value==min.peek())
             min.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return min.peek();
    }

2.用栈实现队列的功能

  问题:用两个栈结构实现队列,支持队列的基本操作(push,pop,peek)

  方法:使用一个栈压入,使用另一个栈弹出。如队列1 2 3 4 5,压入栈时依次入栈,

     在栈内就是1 2 3 4 5 ,5是栈顶,将此栈元素倒入另一个栈,

     在栈内就是5 4 3 2 1,1是栈顶,依次出栈就是一个队列。

  要点:将元素从压入栈倒入弹出栈时,需确保弹出栈为空且压入栈已全部倒入。

3.将栈逆序,要求不能使用额数据结构,只能使用递归函数

  方法:1.使用一个get函数,每次取得并移除栈底元素,其他元素顺序不变。

     2.使用一个reverse函数,每一层都调用一次get,当每一层返回时,将get得到的元素入栈,最后即得到逆序栈。

 public  int get(Stack<Integer> stk) {
        int value=stk.pop();
        int last=value;
        if(!stk.isEmpty()) {
            last=get(stk);
            stk.push(value);
        }
        return last;
    }
    
    public  void reverse(Stack<Integer> stk) {
        int ele=get(stk);
        if(!stk.isEmpty())
            reverse(stk);
        stk.push(ele);
    }

4.按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据

  分析:类似于第一个带最值的栈的问题,使用一个辅助栈,

扫描二维码关注公众号,回复: 592777 查看本文章

    从数据栈依次弹出元素,如果不大于辅助栈栈顶,则入辅助栈,否则,依次从辅助栈弹入到数据栈,直到能够入辅助栈。

    最后数据栈全部压入辅助栈,则将辅助栈全部倒入数据栈,完成排序。

猜你喜欢

转载自www.cnblogs.com/lshao/p/9028225.html