一、栈实现排序概述
将一个栈内的元素实现排序,光靠一个栈肯定是不够的,因为无法实现元素的调动,所以需要一个辅助栈,还有变量。
实现步骤(创建两个栈,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
网友评论