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