给定一个数据无序的链式栈,按照升序排序,要求最多只能使用额外的一个链式栈来复制和缓冲数据,不能将数据复制到其他数据结构。
思路记录:
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










网友评论