美文网首页
链式栈的排序

链式栈的排序

作者: ZYiDa | 来源:发表于2019-11-07 09:43 被阅读0次

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

思路记录:
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

相关文章

  • 链式栈的排序

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

  • 0x06栈

    a、顺序栈 b、链式栈

  • 数据结构之 栈

    栈结构 链式栈 一.栈结构体 1构建空栈 2栈置空 3判断栈空 4获取栈顶 5入栈 6出栈 7便利栈 二.链式栈 ...

  • 顺序存储结构栈 共享栈 链式存储结构栈

  • 基于顺序存储/链式存储设计栈结构

    基于顺序存储/链式存储设计栈结构 栈限定性数据结构,先进后出。 顺序存储栈 链式存储栈

  • 栈与队列(一)

    在这篇文章里,我们来实现自定义的链式栈。首先我们来看看链式栈的结构及操作定义。 链式栈结构定义 首先,新建两个文件...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • 算法04-棋牌游戏常用排序算法

    算法04-棋牌游戏常用排序算法 一、介绍 棋牌游戏常用排序算法包括:链式基数排序、插入排序、希尔排序。 二、链式基...

  • Java实现栈

    数组栈:压栈、出栈、返回栈顶元素 链式栈:压栈、出栈、返回栈顶元素

  • 链式栈

网友评论

      本文标题:链式栈的排序

      本文链接:https://www.haomeiwen.com/subject/ghdmbctx.html