Java用栈实现排序_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用栈实现排序)