zoukankan      html  css  js  c++  java
  • 数据结构-栈

    一.栈的基本概念

      栈是一种特殊的线性表,其插入删除操作都只能在表的尾部进行。栈中允许插入、删除操作的一端称为栈顶,另一端称为栈底。通常栈的插入操作叫入栈,栈的删除操作叫做出栈。

      栈的插入和删除操作只允许在栈顶进行,每次入栈的元素即成为栈顶元素,每次最先出栈的总是栈顶元素,所以栈是一种后进先出的线性表。

      

    二.顺序栈

      1.介绍

      顺序栈是用数组实现的,因为入栈和出栈操作都是在栈顶进行的,所以增加变量top来指示栈顶元素的位置,top指向栈顶元素存储位置的下一个存储单元的位置,空栈时top=0。

      2.基本操作

      1)入栈操作

      入栈操作push(x)是将数据元素x作为栈顶元素插入顺序栈中,主要操作如下。

      (1)判断顺序栈是否为满,若满则抛出异常

      (2)将x存入top所指的存储单元位置

      (3)top加1

        def push(self,x):
            """数据元素x入栈"""
            if self.top == self.maxSize:
                raise Exception("栈已满")
            self.stackElem[self.top] = x
            self.top += 1

      2)出栈操作

      出栈操作pop()是将栈顶元素从栈中删除并返回,主要步骤如下:

      (1)判断顺序栈是否为空,若空则返回null

      (2)top减1

      (3)返回top所指的栈顶元素的值 

        def pop(self):
            """将栈顶元素出栈并返回"""
            if self.isEmpty():
                return None
            self.top -= 1
            return self.stackElem[self.top]

      

      3.应用

      利用顺序栈实现括号匹配

        def isMatched(str):
            s = SqStack(100) #申请栈
            for c in str:
                if c == "(":
                    s.push(c) #如果出现了左括号,入栈
                elif c == ")" and not s.isEmpty():
                    s.pop() #如果出现了右括号,且栈不为空,弹出栈顶的左括号
                elif c == ")" and  s.isEmpty():
                    print("括号不匹配") #如果出现了右括号,栈空了,说明右括号多了
                    return False
            if s.isEmpty():
                print("括号匹配成功") 
            else:
                print("括号匹配不成功") #最后栈中有多余的左括号

    三.链栈

      1.介绍

      采用链式存储结构的栈称为链栈,由于入栈和出栈只能在栈顶进行,不存在在栈的任意位置进行插入和删除操作,所以不需要设置头节点,只需要将指针top指向栈顶元素节点

      2.基本操作 

      1)入栈操作

      入栈操作push(x)是将数据域为x的节点插入到链栈的栈顶,主要步骤如下:

      (1)构造数据值域为x的新节点

      (2)改变新节点和首节点的指针域,使新节点成为新的栈顶节点 

        def push(self,x):
            """x入栈"""
            s = Node(x,self.top)
            self.top = s

      

      2)出栈操作

      出栈操作pop()是将栈顶元素从链栈中删除并返回其数据域的值,主要步骤如下。

      (1)判断链栈是否为空,若空则返回null

      (2)修改top指针域的值,返回被删节点的数据域的值

        def pop(self,x):
            """将栈顶元素出栈并返回"""
            if self.isEmpty():
                return None
            p = self.top
            self.top = self.top.next
            return p.data

      

  • 相关阅读:
    素材收集
    网站返回503
    uva 1048 最短路的建图 (巧,精品)
    hdu5188 01 背包
    hdu 5187 快速幂 + 快速乘 值得学习
    差分约束
    uva11090 Bellman-Ford 运用
    hdu 5185 动态规划 分析降低复杂度
    hdu5184 数论证明
    HDU5183 hash 表
  • 原文地址:https://www.cnblogs.com/jiangfan95/p/12205816.html
Copyright © 2011-2022 走看看