美文网首页
Swift 队列&栈 相关操作

Swift 队列&栈 相关操作

作者: 螺旋爆炸不要怕 | 来源:发表于2019-04-20 16:14 被阅读0次

LIFO(后进先出)

struct Stack<T>{
    var items = [T]()
    var top:T?{
        get
        {
            return items.last
        }
    }
    var isEmpey:Bool {
        get {
            return items.isEmpty
        }
    }
    var size:Int {
        get {
            return items.count
        }
    }
    
   mutating func push(_ newItem: T){
        items.append(newItem)
    }
    
    mutating func pop() ->T?{
        return items.popLast()
    }
}

//  test.stack
var stack = Stack<String>()
print(stack.isEmpey)
print(stack.size)
print(stack.top as Any)

stack.push("l")
stack.push("o")
stack.push("v")
stack.push("e")
print(stack.isEmpey)
print(stack.size)
print(stack.pop()!)
print(stack.size)

队列

FIFO(先进先出)

struct Queue{
    var queue = [Any]()
    var isEmpty:Bool  {
        get {
            return queue.isEmpty
        }
    }
    var size:Int {
        get {
            return queue.count
        }
    }
    
    var peek:Any?{
        get{
            return queue.first
        }
    }
    
    mutating func enqueue(_ newItem:Any){
        queue.append(newItem)
    }
    
    mutating func dequeue() -> Any?{
        return queue.removeFirst()
    }
}

var queue = Queue()
print(queue.isEmpty)
print(queue.size)
print(queue.peek as Any)
queue.enqueue(1)
queue.enqueue("love")
queue.enqueue(2)
queue.dequeue()
print(queue)

队列与栈相互的实现

栈 - 队列实现

struct Q_stack{
    var queueA:Queue //主操作队列 用来入栈  出栈先出队只保留最先进入队列的数,即栈顶元素
    var queueB:Queue //协助队列 用来装未操作的栈元素
    init(){
        queueA = Queue()
        queueB = Queue()
    }
    
    mutating func shift(){
        while queueA.size != 1 {
            queueB.enqueue(queueA.dequeue()!)
        }
    }
    mutating func swap(){
        (queueB,queueA) = (queueA,queueB);
    }
    
    var isEmpty:Bool{
        get{
            return queueB.isEmpty && queueA.isEmpty
        }
    }
    
    var size:Int{
      mutating get{
            return queueA.size
        }
    }
    
    var top:Any?{
      mutating get{
            shift()
            let peekVal = queueA.peek
            queueB.enqueue(queueA.dequeue()!)
            swap()
            return peekVal
        }
    }
    
   mutating func push(_ newItem: Any)  {
        queueA.enqueue(newItem)
    }
    
    mutating func pop() -> Any?{
        shift()
        let popVal = queueA.dequeue()
        swap()
        return popVal
    }
}

var q_stack = Q_stack()
print(q_stack.isEmpty)
print(q_stack.size)
q_stack.push(10)
print(q_stack.size)
q_stack.push("sss")
print(q_stack.top as Any)
print(q_stack.pop() as! String)
print(q_stack.pop() as Any)

队列 - 栈实现

struct S_queue<T>{
    var stackA:Stack<T>
    var stackB:Stack<T>
    
    init() {
        stackA = Stack<T>()
        stackB = Stack<T>()
    }
    
    mutating func shift(){
        while !stackB.isEmpey {
            stackA.push(stackB.pop()!)
        }
    }
    
    var isEmpty :Bool{
        get{
            return stackA.isEmpey && stackB.isEmpey
        }
    }
    var size:Int {
        get{
            return stackA.size + stackB.size
        }
    }
    var peek:Any?{
       mutating get{
            shift()
        return stackA.top
        }
    }
    
   mutating func enqueue(_ newItem:T){
        stackB.push(newItem)
    }
    
    mutating func dequeue() -> T?{
        shift()
        return stackA.pop()
    }
}

var s_queue = S_queue<String>()
print(s_queue.isEmpty)
print(s_queue.size)
print(s_queue.peek as Any)
s_queue.enqueue("love")
s_queue.enqueue("i")
s_queue.enqueue("you")
print(s_queue.dequeue()!)
print(s_queue.size)
print(s_queue.peek!)
print(s_queue.dequeue()!)
print(s_queue.dequeue()!)

相关算法题

简化文件路径 "/a/./b/../../c/" -> "/c"

func simplifyPath(_ pathStr:String) -> String{
    var pathStack = Stack<String>()
    let pathArr = pathStr.components(separatedBy: "/")
    for path in pathArr{
        guard path != "." else {
            continue
        }
        if path == ".." {
            if pathStack.size > 0 {
                pathStack.pop()
            }
        }
        else if path != ""{
            pathStack.push(path)
        }
    }
    
//    let res = pathStack.items.reduce("") { (total, dir) -> String  in
//        return "\(total)/\(dir)"
//    }
    let res = pathStack.items.reduce("") { 
        return "\($0)/\($1)"
    }


    return res.isEmpty ? "/": res
}
print(simplifyPath("/a/./b/./../c/"))
print(simplifyPath("/a/./b/../../../c/"))

iOS面试之道学习笔记

相关文章

  • Swift 队列&栈 相关操作

    栈 LIFO(后进先出) 队列 FIFO(先进先出) 队列与栈相互的实现 栈 - 队列实现 队列 - 栈实现 相关...

  • iOS开发集锦之 2017.03.30(Swift 算法实战之路

    1. Swift 算法实战之路:栈和队列 作者: 故胤道长描述:栈和队列的基本Swift实现,以及在iOS开发中应...

  • 数据结构:栈与队列

    本文内容:一、栈1、什么是栈?2、栈的操作集.3、栈的 C 实现.二、队列1、什么是队列?2、队列的操作集.3、队...

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • 未知分类

    栈和队列的区别? 栈的插入和删除操作都是在一端进行的,而队列的操作却是在连端进行的。 队列先进先出,栈后进后出 栈...

  • LeetCode 每日一题 [12] 用队列实现栈

    LeetCode 用队列实现栈 [简单] 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈pop(...

  • 数据结构-队列

    队列特点 先进先出 从队尾入队列 从队头出队列 队列的相关操作集中在队头与队尾 队列的接口抽象 队列与栈一样有这以...

  • 数据结构(2)-栈和队列和Hash表

    栈和队列 栈 限定仅在表尾进行的插入和删除操作栈有顺序存储结构和链式存储结构 队列 队列是只允许在一段进行插入操作...

  • LeetCode:栈实现队列&队列实现栈

    225. 用队列实现栈 使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元...

网友评论

      本文标题:Swift 队列&栈 相关操作

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