栈系列之-排序

作者: 愤怒的谜团 | 来源:发表于2019-11-29 17:20 被阅读0次

    一、栈实现排序概述

    将一个栈内的元素实现排序,光靠一个栈肯定是不够的,因为无法实现元素的调动,所以需要一个辅助栈,还有变量。
    实现步骤(创建两个栈,OriginStack和sortedStack)

    • OriginStack为原始栈,里面存储着需要排序的数据
    • sortedStack初始为一个空栈
    • 将stack的元素elem弹栈,然后压栈进sortedStack,当然这是有条件的,如果sortedStack为空直接压栈进sortedStack,如果不为空,将elem与sortedStack.GetTop()进行比较,如果elem<=sortedStack.GetTop(),则直接压栈进sortedStack,如果elem>sortedStack.GetTop(),则将sortedStack的元素弹栈然后压栈进stack,然后继续执行比较,这里是个循环,直至达到elem<=sortedStack.GetTop()这个条件或者sortedStack为空栈。
    • 然后将sortedStack的元素依次压栈进OriginStack,OriginStack就是一个从大到小排序的栈了。

    二、栈实现排序代码-java

    import java.util.Stack;
    
    public class SortedStack {
        Stack<Integer> OriginStack;
        Stack<Integer> sortedStack;
        public SortedStack(Stack<Integer> originStack){
            this.OriginStack = originStack;
            this.sortedStack = new Stack<Integer>(); //创建一个辅助栈
        }
    
        public void sort(){
            if (OriginStack.size() == 0){return;}
    
            while (OriginStack.size() != 0){
                //当原始栈存在数据,就一直执行while循环,一直到原始栈为空为止。
                Integer elem = OriginStack.pop();
                if (sortedStack.size() == 0){
                    //sortedStack为空,直接压栈
                    sortedStack.push(elem);
                }else if (elem <= sortedStack.peek()){
                    //满足elem <= sortedStack.peek(),直接压栈
                    sortedStack.push(elem);
                }else{
                    //当elem > sortedStack.peek()则进行循环,将sortedStack的元素依次对比压栈进OriginStack
                    while (elem > sortedStack.peek()){
                        OriginStack.push(sortedStack.pop());
                        if (sortedStack.size() == 0){
                            break;
                        }
                    }
                    sortedStack.push(elem);
                }
            }
            while (sortedStack.size() != 0){
                OriginStack.push(sortedStack.pop());
            }
        }
        public String toString(){
            return OriginStack.toString();
        }
    
        public static void main(String[] args) {
            Stack<Integer> oriStack = new Stack<>();
            oriStack.push(9);
            oriStack.push(1);
            oriStack.push(0);
            oriStack.push(2);
            System.out.println(oriStack.toString()); // [9, 1, 0, 2]
    
            SortedStack sortedStack = new SortedStack(oriStack);
            sortedStack.sort();
            System.out.println(sortedStack.toString());  // [0, 1, 2, 9]
        }
    }
    
    

    三、图例说明算法运行过程

    3.1、首先是初始状态


    image.png

    3.2、元素2进入sortedStack


    image.png

    3.3、元素0进入sortedStack


    image.png

    3.4、元素1与0进行对比,然后 0元素进入OriginStack,1进入sortedStack


    image.png

    3.5、然后元素0再次进入sortedStack


    image.png

    3.6、然后元素9弹栈,发现比0,1,2,都大,所以,sortedStack里面的元素都弹栈,然后插入到
    OriginStack栈里。


    image.png

    3.7、最后在将OriginStack栈里的元素按照刚才的规则压栈进sortedStack


    image.png

    3.8、最后将sortedStack的元素依次压栈进OriginStack就好了。


    image.png

    相关文章

      网友评论

        本文标题:栈系列之-排序

        本文链接:https://www.haomeiwen.com/subject/zuugwctx.html