数据结构-栈

一.栈的基本概念

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

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

  

二.顺序栈

  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

  

原文地址:https://www.cnblogs.com/jiangfan95/p/12205816.html