链式栈的排序

给定一个数据无序的链式栈,按照升序排序,要求最多只能使用额外的一个链式栈来复制和缓冲数据,不能将数据复制到其他数据结构。

思路记录:
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中的顺序就是升序顺序
    如下图
    链式栈的排序_第1张图片
    思路记录图

接下来上代码

fun SortOfStack(){

    val totoal:Int = Int.MAX_VALUE
    val stack = Stack(totoal)
    val tmpStack = Stack(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

你可能感兴趣的:(链式栈的排序)