数据结构和算法----栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bquau/article/details/88868723

  • 栈的定义

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。遵循后进先出,先进后出。

  • 分类

1、顺序栈:用数组实现的栈  固定的大小

        2、链式栈:用链表实现的栈  支持动态扩容

三、栈的应用

1、检测就近匹配的成对出现的符号

2、表达式求值

3、浏览器的前进和后退

四、代码实现

1、检测就近匹配的成对出现的符号

"""假设字符串只由[](){}三中括号组成"""

def pipei(data):

    lis = []

    kuohao = {"{":"}","[":"]","(":")"}

    for da in data:

        #判断是否是左括号,如果是则入栈

        if da in kuohao.keys():

           lis.append(da)

        #如果是右括号,并与栈顶左括号对应的话则出栈

        elif da in kuohao.values():

           if lis and kuohao[lis[-1]] == da:

              lis = lis[:-1]

           else:

              return False

    if lis:

       return False

    else:

       return True

2表达式求值

"""只包含简单的加减乘除运算 例如:((1+4)*2/3)+2,今天了解python列表特性时突然发现list的切片的时间复杂度为O(k),代码中频繁切片不是很理想,将num[:-1]改为num.pop()时间复杂度就变为了O(1)。想到一个切片的好的解决办法就是添加个头指针,对列表中数据操作进行限制到一定数量时再对其进行切片迁移操作,会浪费些内存空间,但是均摊的时间复杂度为O(1)"""

#encoding:utf-8

def expression(data):

    num = []

    asd = ""

    operator = []

    pro = ["*","/","(","+","-"]

    end = ["*","/"]

    for da in data:

        #print(num)

        if da in pro:

           operator.append(da)

           if da in end:

               continue

        elif da == ")" and operator:

           while operator[-1] != "(":

               asd =  operator[-1] + num[-1] +asd

               num = num[:-1]

               operator = operator[:-1]

           asd = num[-1]+asd

           operator = operator[:-1]

           num = num[:-1]

           num.append(expression(asd)[0])

        else:

           num.append(da)

        if operator:

            if operator[-1] in end:

                num = yunsuan(operator[-1],num)

                operator = operator[:-1]

    if operator:

        for oper in operator[::-1]:

            num = yunsuan(oper, num)

            operator = operator[:-1]

    return num

def yunsuan(oper,num):

            #print(oper)

            if oper == "+":

                res = str(int(num[-2]) + int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "-":

                res = str(int(num[-2]) - int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "*":

                ##print(int(num[-2]),int(num[-1]))

                res = str(int(num[-2]) * int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "/":

                res = str(int(int(num[-2]) / int(num[-1])))

                num = num[:-2]

                num.append(res)

            return num

 

  1. 浏览器的前进和后退

将查看的网页按先后顺序入站。

然后如果这时候,你爸爸进来了。赶紧后退!点击返回按钮

这时候栈的操作是

将栈顶移入另一个栈,当前显示的是淘宝页面!然后你爸爸问你晚饭吃什么之后又出去了!想要前进到刚才的页面。点击它

                   

          当前展示的页面就是你不想给你爸爸看到的页面!

代码是自己编的,都能实现功能。如果发现问题或有更优化的代码请评论!!!

本文由博主学习总结而来,如果有错误的地方请指正。有多处借鉴!借鉴于

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect

https://time.geekbang.org/column/article/40961

万分感谢马老师和王争大佬的知识分享!

猜你喜欢

转载自blog.csdn.net/bquau/article/details/88868723