给定一个数据无序的链式栈,按照升序排序,要求最多只能使用额外的一个链式栈来复制和缓冲数据,不能将数据复制到其他数据结构。
思路记录:
stack
是需要排序的栈,tmpStack
是缓冲栈
- 当
tmpStack
为空时,将stack
栈顶元素压栈存入tmpStack
,同时将其出栈 - 当
tmpStack
不为空时
1、将stack
栈顶元素复制给一个变量top
,并将其出栈
2、当tmpStack
栈顶元素tmpStackTop
小于top
时,将tmpStackTop
压栈存入stack
,同时将其出栈
3、循环2中的操作,直至tmpStackTop
不再小于top
,跳出循环
4、此时将top压栈存入tmpStack
5、循环1-4中的操作,直至stack
为空,其元素已全部出栈按照降序顺序存入tmpStack
中
6、将tmpStack
中的元素依次出栈并通过压栈存入stack
。因为tmpStack
里面的顺序是降序顺序,所以存入stack
中的顺序就是升序顺序。
如下图
思路记录图
接下来上代码
fun SortOfStack(){
val totoal:Int = Int.MAX_VALUE
val stack = Stack<Int>(totoal)
val tmpStack = Stack<Int>(totoal)
for (i in 0 until 10){
//获取随机整数并进行压栈
val r = (Math.random() * 1000).toInt()
stack.push(r)
}
//遍历显示排序前结果
stack.dfs()
print("**************\n")
while (!stack.empty()){
//第一次,先将stack栈顶的元素压栈进tmpStack,同时将其从stack出栈
if (tmpStack.empty()){
val top = stack.peek()
tmpStack.push(top!!)
stack.pop()
}
//第二次及以后 因为要以升序方式排序,所以在往tmpStack中压栈时要以降序的方式进行压栈
//1、每次先获取stack栈顶的元素,并赋值给变量top
val top = stack.peek()
stack.pop()
//2、如果stack栈顶元素top大于tmpStack栈顶元素,将tmpStack栈顶元素出栈并压栈进入stack
//3、循环2中的操作,直至tmpStack栈顶元素不再小于top,将top压栈进入tmpStack
while ((!tmpStack.empty()) && (tmpStack.tmpNode?.data!! < top!!)){
val tmpTop = tmpStack.peek()
stack.push(tmpTop!!)
tmpStack.pop()
}
tmpStack.push(top!!)
}
tmpStack.dfs()
print("**************\n")
//4、将tmpStack中的元素出栈后 压栈进入stack,stack中的元素就是按照升序排序进行存储的
while (!tmpStack.empty()){
stack.push(tmpStack.pop()!!)
}
//遍历显示结果
stack.dfs()
}
控制台输出显示结果:
Node-Data:728
Node-Data:882
Node-Data:216
Node-Data:884
Node-Data:185
Node-Data:789
Node-Data:232
Node-Data:63
Node-Data:814
Node-Data:941
**************
Node-Data:63
Node-Data:185
Node-Data:216
Node-Data:232
Node-Data:728
Node-Data:789
Node-Data:814
Node-Data:882
Node-Data:884
Node-Data:941
**************
Node-Data:941
Node-Data:884
Node-Data:882
Node-Data:814
Node-Data:789
Node-Data:728
Node-Data:232
Node-Data:216
Node-Data:185
Node-Data:63
Process finished with exit code 0
网友评论