Java中的栈排序

    本篇博客是上一篇博客的延续。在实现图论算法的过程中,需要对栈中的元素进行排序。我使用的是双栈排序算法,实现的是将栈中的元素按从大到小的顺序排列,现将该算法的思路总结如下:

    1、算法主要涉及到两个栈,stackSrc和stackDes。stackSrc是原始存储数据的栈,简称源栈;stackDes是用来存储排序之后元素的栈,简称目的栈。

    2、首先判断源栈stackSrc是否为空,如果为空,则抛出异常NoSuchElementException。

    3、如果源栈非空,则进入while循环,while循环执行的条件是源栈stackSrc非空,在while循环之中,将stackSrc的首元素出栈并赋给中间变量minInt,然后嵌套一个while循环,此while循环的作用是将目的栈stackDes中的首元素和minInt比较,如果minInt的值大于或等于目的栈首元素的值,则直接将minInt压入目的栈,跳出这一层while循环,继续执行最外层while循环。

    4、如果minInt的值比目的栈首元素小,则目的栈栈首元素出栈,并将压入源栈,然后将minInt与目的栈的下一个首元素比较,直到不满足循环条件为止,跳出循环。第二个while循环执行的条件是目的栈不为空并且minInt的值比目的栈首元素小。在此,还需注明一点,当目的栈为空时,将minInt值直接压入目的栈。

    5、按照上述思路,使用两层while循环可以确保源栈中每个元素均与目的栈中的每个元素作比较,最终排出正确的从大到小的元素顺序存储在目的栈中。

    下面就是实现上述双栈排序算法的源代码:

class StackSort {

    /**
     * sort the stack in descending array return a reference of a stack
     */
    public static Stack stacksort(Stack stackSrc) {
        //creats an destination Stack object
        Stack stackDes = new Stack();
        //temp variable
        int minTemp;

        if (stackSrc.size() == 0) {
            //throw exception
            throw new NoSuchElementException("所要排序的栈为空栈!");
        } else {
            while (stackSrc.size() != 0) {
                //record the top element of the stack
                minTemp = stackSrc.pop();
                //compare every element in stackDes with 
                //minTemp to find the min element
                while ((stackDes.size() != 0) && (stackDes.peek() > minTemp)) {
                    //push the bigger element into stackSrc
                    stackSrc.push(stackDes.pop());
                }
                //push the smaller element into stackDes
                stackDes.push(minTemp);
            }
        }
        return stackDes;
    }
}



你可能感兴趣的:(Java中的栈排序)