递归专项-栈排序

这篇博客探讨了如何使用栈进行排序,主要介绍了两种方法:一种是通过维护两个栈,用辅助栈确保栈顶元素始终是最小的;另一种是利用递归思路,仅使用一个栈完成排序。这两种方法都在不使用额外数据结构的前提下实现了栈排序,适用于元素数量在5000以内的场景。
摘要由CSDN通过智能技术生成

在这里插入图片描述

题目

面试题 03.05. 栈排序
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。

示例1:

输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
示例2:

输入:
[“SortedStack”, “pop”, “pop”, “push”, “pop”, “isEmpty”]
[[], [], [], [1], [], []]
输出:
[null,null,null,null,null,true]
说明:

栈中的元素数目在[0, 5000]范围内。

题目描述了可以额外使用一个栈,实际上我们可以通过一个临时栈来暂存数据,来相互倒腾一下,保持有序。代码如下:


public class P0305 {


    class SortedStack {

        private Deque<Integer> stack;
        private Deque<Integer> temp;
        public SortedStack() {

            stack = new ArrayDeque<>();
            temp = new ArrayDeque<>();
        }

        public void push(int val) {

            while (!stack.isEmpty() && val > stack.peek()) {
                Integer pop = stack.pop();
                temp.push(pop);
            }
            stack.push(val);
            while (!temp.isEmpty()) {
                stack.push(temp.pop());
            }
        }

        public void pop() {
            if (!stack.isEmpty()) {
                stack.pop();
            }
        }

        public int peek() {

            return stack.isEmpty() ? -1 : stack.peek();
        }

        public boolean isEmpty() {

            return stack.isEmpty();
        }
    }
}

这里面显示使用了两个栈, 还有一种解法使用递归替代一个栈,这个思路比较像递归:如何逆序一个栈(递归: 如何逆序一个栈(不使用其余数据结构))。代码如下:

public class P03052 {
    class SortedStack {
        private Deque<Integer> stack;
        public SortedStack() {
            stack = new ArrayDeque<>();
        }

        public void push(int val) {


            // 直接可以入栈的
            if (!stack.isEmpty() && val <= stack.peek()) {
                stack.push(val);
                return;
            }

if (stack.isEmpty()) {
    stack.push(val);
    return;
}
            // 递归的进行栈排序
            Integer pop = stack.pop();
            push(val);
            stack.push(pop);
        }

        public void pop() {
            if (!stack.isEmpty()) {
                stack.pop();
            }
        }

        public int peek() {

            return stack.isEmpty() ? -1 : stack.peek();
        }

        public boolean isEmpty() {

            return stack.isEmpty();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值