美文网首页
数据结构-栈

数据结构-栈

作者: a_只羊 | 来源:发表于2021-02-25 17:27 被阅读0次

栈的特点

  • 先进后出
  • 栈的相关操作都是通过栈顶位置进行相关操作的

栈的接口抽象

栈可以通过线性表直接实现(链表、数组等线性表),由于栈有着先进后出的特点,同时关于栈的操作都集中在栈顶位置,所以基础的栈接口有这以下几个:

//入栈
func push(element: E)

//出栈
func pop()

//栈容量
func size() -> Int?

//是否为空
func isEmpty() -> Bool

//栈顶元素
func top() -> E?
    

栈的实现

由于线性表的基本功能已经能够满足栈的基本操作,所以可以对基础的线性表进行 再封装 来实现栈的相关功能。有两种方案可供选择:

  1. 继承线性表实现相关的栈的功能
  2. 通过对象组合的形式实现栈的功能

第一种通过继承的方式实现栈的功能是有缺陷的,因为会将栈中不存在的功能通过继承加到了栈中,会造成一定的接口干扰。由此可见,使用第二种较为合适。

struct Stack<E: Equatable> : CustomStringConvertible {
    
    var description: String {
        get {
            var mutatingSelf = self
            return mutatingSelf.list?.description ?? ""
        }
    }
    
    var defaultArrayType: E
    
    lazy var list: DynamicArray<E>? = {
        DynamicArray<E>(defaultValue: defaultArrayType)
    }()
    
    init(arrayDefault: E) {
        self.defaultArrayType = arrayDefault
    }
    
    mutating func push(element: E) {
        list?.add(element: element)
    }

    mutating func pop() {
        if let size = list?.size() {
            list?.remove(index: size - 1)
        }
    }
    
    mutating func size() -> Int? {
        list?.size()
    }
    
    mutating func isEmpty() -> Bool {
        list?.isEmpty() ?? false
    }
    
    mutating func top() -> E? {
        if let size =  list?.size() {
            return size > 0 ? list?[size - 1] : nil
        }
        return nil
    }
    
}

栈的练习

题目

给定一个只包括'(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合
  • 左括号必须以正确的顺序闭合

思路:如果括号成对出现,在遍历的时候成对括号出现的特点:

  1. 先拿出成对括号的左边
  2. 右边的括号一旦出现优先比较第一步中最后的左边括号并比较是否成对匹配
  3. 全部匹配完成则成立,一旦有一个匹配不对,则不成立

由于有着先进后出比较的操作,这里使用栈进行相关操作比较比较合理。实现如下:

func isVaild(str: String) -> Bool {
    
    var stack: Stack = Stack<Character>(arrayDefault: "c")
    //使用字典存储相关的配对括号
    let pairDict : Dictionary<Character,Character> = ["(":")","[":"]","{":"}"]
    
    for (_, element) in str.enumerated() {
        let character = element
        if character == "(" || character == "[" || character == "{" {
            stack.push(element: character)
        }else {
            if character == ")" || character == "]" || character == "}"  {
                if stack.isEmpty() || character != pairDict[stack.top()!]{
                    return false
                }
                if pairDict[stack.top()!] == character {
                    stack.pop()
                }
            }
        }
    }
    
    
    return stack.isEmpty()
   
}

相关文章

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 004 go语言实现栈

    1 数据结构 数据结构: 要实现的功能:0 栈的初始化1 获取栈长度2 入栈3 出栈4 清空栈内容5 判断栈是否为...

  • java高级知识点

    1.数据结构 程序=数据结构+算法 栈:后进先出,线性结构 入栈:push 出栈:pop假如已知入栈顺序是ab...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

  • 数据结构与算法 第二节:栈 栈: 一种先进后出的数据结构。可以想象成手枪的弹夹。 栈的特点: 栈的行为: 栈的代...

  • 2019-07-11—栈

    栈:Java数据结构和算法(四)——栈 string和char一般这么转化: 21、定义栈的数据结构,请在该类型中...

  • 什么是堆栈?

    堆与栈是两种数据结构,并不是一种数据结构,堆是堆,栈是栈。 1、栈:是一种只能在一端进行插入和删除的数据结构。 允...

  • 05--栈 递归

    栈 栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线...

  • 18-04-21 python3 算法笔记 002基本数据结构

    线性数据结构 栈,队列,deques,列表其元素在数据结构中的位置由它被添加时的顺序决定。 栈 后进先出栈 LI...

  • 数据结构

    数据结构:要写!!手动!!数据结构非常简洁才可 栈 eg. 弹栈压栈的过程 链表 就是原型链不断的连接,要断去某个...

网友评论

      本文标题:数据结构-栈

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