Swift 队列&栈 相关操作

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面试之道学习笔记

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,801评论 1 32
  • 1.栈的定义 栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 结论:后进先出...
    西西里的姑娘阅读 3,342评论 0 0
  • 栈 栈的英文单词是Stack,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入,...
    Jack921阅读 5,424评论 0 5
  • 预备知识—程序的内存分配 一个由C/C 编译的程序占用的内存分为以下几个部分:1、栈区(stack)—> 由编译器...
    绚雨蓝了个枫阅读 9,756评论 0 3
  • 1. 栈 1.1 定义 栈,即只能在表尾进行插入或删除操作的线性表。 其中,“表尾”称为“栈顶”,另一端则为“栈底...
    我才是臭吉吉阅读 3,318评论 0 0