2020-06-21  本文已影响0人  旺仔_100

一、堆栈(链表实现)


堆栈.jpg

这种栈只有一个入口,它也是出口。从入口把数据放进去,取的时候只能取出最上面的数据。了解了数据结构,在看来代码就很简单了。

/**
 * 把元素放到栈顶,然后每次从栈顶取元素
 */
class Stack {
    //他有两个成员变量  一个是size N   一个是first 节点

    private var N  = 0;
    private var first : Node? = null;

     class Node(var content: String, var next : Node?)

    //压站
    fun pop(content : String){
       //这里其实可以专门写个添加first的方法,然后做判断的
        if (first == null){
            first = Node(content,null)
            return
        }
        val olderFirst = first
        first = Node(content, olderFirst)
        N++
    }

    //出栈
    fun push() : String?{
        val content = first?.content
        first = first?.next
        N--
        return content
    }
   //栈是否为空
   fun isEmpty() : Boolean{
        return first == null
    }

    fun getSize() : Int{
        return N
    }

}

写了一个最简易的栈,看下如何使用

        var stack = Stack()
       //压栈
        stack.pop("1")
        stack.pop("2")
        stack.pop("3")
        stack.pop("4")
        stack.pop("5")
        stack.pop("6")

      //其实可以在Stack里面写个迭代器,迭代打印。不会的可以看下面例子的代码
        for (i in 0 .. stack.getSize()){
            //出栈
            Log.d("azy",stack.push())
        }

打印结果

2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 6
2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 5
2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 4
2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 3
2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 2
2020-06-14 15:24:48.034 6075-6075/com.example.kotlindemo D/azy: 1

总结:先压栈的最后出来


I get it.jpeg

二、队列(链表实现)

队列.jpg

如上图,从队尾插入数据,从队头取数据。这样保存的数据,插入的顺序和取出来的顺序是一样的。

来个最简单的实现

**
 * 需要一个头节点来出队列
 * 需要一个尾节点来进队列
 * 需要一个队列的长度
 *
 */
class Queue  : Iterable<String>{
    class Node(var  content : String,var  next : Node?)
    private var first : Node? = null
    private var last : Node? = null
    private var N : Int = 0

    fun isEmpty() : Boolean{
        return first == null
    }

    fun getSize() : Int{
        return N;
    }

    //进栈
    fun enqueue( content : String){
        //从队尾添加元素
        var oldLast = last;
        last = Node(content,null)
        if (isEmpty()){
            first = last
        }else
        oldLast?.next = last
        N++
    }
    //出栈
   fun dequeue() : String?{
        var item = first?.content
        first = first?.next
        if (isEmpty()){
           last = null
        }
        N++
        return item
    }

   override fun iterator(): Iterator<String> {
        return ListIterator()
    }

    inner class ListIterator : Iterator<String> {
        private var current = first
        override fun hasNext(): Boolean {
            return current == null
        }


        override fun next(): String {
                var content = current?.content
                current = current?.next
                //这个迭代器不知道为什么不能使用String? 所以这里转换了一下
                return  content ?: "" 
        }
    }

}

如何使用?

 var queue = Queue()
        queue.enqueue("1")
        queue.enqueue("2")
        queue.enqueue("3")
        queue.enqueue("4")
        queue.enqueue("5")
        queue.enqueue("6")

        for (i in 0 .. queue.getSize()){
            Log.d("azy",queue.dequeue())
        }

打印结果

2020-06-21 10:47:16.356 7529-7529/com.example.kotlindemo D/azy: 1
2020-06-21 10:47:16.356 7529-7529/com.example.kotlindemo D/azy: 2
2020-06-21 10:47:16.356 7529-7529/com.example.kotlindemo D/azy: 3
2020-06-21 10:47:16.357 7529-7529/com.example.kotlindemo D/azy: 4
2020-06-21 10:47:16.357 7529-7529/com.example.kotlindemo D/azy: 5
2020-06-21 10:47:16.357 7529-7529/com.example.kotlindemo D/azy: 6

总结一下:根据堆栈和队列的打印结果,不难看出,堆栈是存入和取出的顺序是相反的,而队列存入和取出的顺序是相同的。

这是讨论啥呢.jpeg
上一篇下一篇

猜你喜欢

热点阅读