zoukankan      html  css  js  c++  java
  • 栈 和 队列

    1、栈和队列的概述

    栈和队列主要用于计算过程中数据的临时保存。如果需要存储的数据项数不能够事先确定,就必须采用更复杂的存储机制和管理,这种存储机制称为缓冲存储或者缓存。栈和队列就是使用最多的缓冲存储结构

    栈和队列也是最简单的缓存结构,他们只支持数据项的存储和访问。

    栈和队列作为数据结构需要提供几个基本的操作,如:创建,检查空。检查满等

    栈是保证元素的后进先出LIFO,队列是元素的先进先出FIFO,对于栈或队列,在任何时候,下一次访问或/和删除的元素都默认地唯一确定。只有新的存入或删除操作才会改变下一次默认访问的元素。

    实现栈或队列最简单的技术就是用元素存储的顺序表示他们存储的时间

    2、栈的描述及抽象数据类型

    栈是一种容器,可存入数据元素、访问元素、删除元素。

    栈的定义操作包括:栈的创建、判断栈是否为空、将栈元素亚茹栈中、从栈中弹出元素并将其返回、以及检查栈元素

    采用顺序表实现栈时候的问题:1.是采用简单顺序表还是采用动态顺序表?2、如果采用简单的顺序表就会出现栈满的情况,而如果采用动态顺表存储区满时可以更换更大的存储区。单这时又会出现存储区置换策略的问题

    为了更清晰的理解使用python的list构建一个栈

    class mystock:
    
        def __init__(self):
            self._elem = []
        
        def is_empty(self):
            if not len(self._elem):
                return True
            else:
                return False
        
        def top(self):
            if not len(self._elem):
                raise Stockisempty
            return self._elem[-1]
        
        def pop(self):
            if not len(self._elem):
                raise Stockisempty
            return self._elem.pop()
    
        def push(self, elem):
            self._elem.append(elem)
    View Code

    3、栈的链接表实现

     链接表的实现的缺点是其会更多的依赖于解释器的存储管理,每个结点的链接开销,以及链接结点在实际计算机内存中随意散布可能带来的操作开销

    class LNode:
    
        def __init__(self, elem, next=None):
            self._elem = elem
            self._next = next
    
    
    class Llist:
    
        def __init__(self):
            self.head = None
    
        def append(self, elem):
            current1 = LNode(elem)
            current2 = self.head
            if not self.head:
                self.head = current1
                return self.head._elem
            else:
                while current2._next != None:
                    current2 = current2._next
                current2._next = current1
                return current2._next._elem
    
        def pop(self):
            current1 = self.head
            if not head:
                raise ValueError
            else:
                while current1._next != None:
                    current2 = current1
                    current1 = current1._next
                current2._next = None
    
    
    class mystock:
    
        def __init__(self):
            self._elem = Llist()
        
        def is_empty(self):
            if not self._elem.head:
                return True
            else:
                return False
        
        def top(self, s):
            if not self._elem.head:
                raise Stockisempty
            return self._elem.head._elem
        
        def pop(self):
            if not len(self._elem):
                raise Stockisempty
            return self._elem.pop()
    
        def push(self, elem):
            return self._elem.append(elem)
    
    s = mystock()
    print(s.push(1))
    print(s.push(2))
    View Code

     4、栈的应用

    栈的两个基本用途,一个是可以很方便的临时保存和取用信息,二是其后进先出的存取性质很重要

    简单的应用:括号的匹配问题  以 小括号,中括号,大括号为例(不考虑其他多余的括号)

  • 相关阅读:
    完美解决微信端设置title失败问题
    linux下的find&&grep查找命令
    微信开发二三事
    干掉chrome下input恶心的黄色背景
    关于.gitignore文件使用说明
    HTTPie:一个不错的 HTTP 命令行客户端
    退出登录功能改变window的rootviewcontroller输入框键盘不会收起
    coredata操作工具
    并发编程gcd粗暴记忆法
    网友的百度移动云可穿戴部门的面试经历
  • 原文地址:https://www.cnblogs.com/bianjing/p/10369624.html
Copyright © 2011-2022 走看看