栈的几种应用场景

1. 栈来实现表达式求值

def match_number(sign,one_number,two_number):

    if sign == "*":
        return one_number * two_number
    elif sign == "/":
        return one_number / two_number
    elif sign == "+":
        return one_number + two_number
    elif sign == "-":
        return one_number - two_number


def match_four(expression):

    number_stack = LinkStack()
    sign_stack = LinkStack()

    tmp = ""
    for s in expression :
        
        if ord(s) >= 48 and ord(s) <= 57 : 
            tmp += s
            continue
        number_stack.push(int(tmp))
        tmp = ""
        if sign_stack.count == 0 :
            sign_stack.push(s)
            continue
        while (True):
            if sign_stack.count == 0 :
                sign_stack.push(s)
                break
            prev_sign = sign_stack.pop()
            if s in "*/" and prev_sign in "+-" :
                sign_stack.push(prev_sign)
                sign_stack.push(s)
                break
            else:
                two_number = number_stack.pop()
                one_number = number_stack.pop()
                number_stack.push(match_number(prev_sign,one_number,two_number)) 
    number_stack.push(int(tmp))
    if sign_stack.count > 1 :
        one_sign = sign_stack.pop()
        prev_sign = sign_stack.pop()
        if one_sign in "*/" and prev_sign in "+-":
            two_number = number_stack.pop()
            one_number = number_stack.pop()
            r = match_number(one_sign,one_number,two_number)
            end_number = number_stack.pop()
            return match_number(prev_sign,end_number,r)
        else :
            one_sign = sign_stack.pop()
            prev_sign = sign_stack.pop()
            three_number = number_stack.pop()
            two_number = number_stack.pop()
            one_number = number_stack.pop()
            return match_number(one_sign,match_number(prev_sign,one_number,two_number),three_number) 
    else :
        sign = sign_stack.pop()
        two_number = number_stack.pop()
        one_number = number_stack.pop()
        return  match_number(sign,one_number,two_number)
#  print(match_four("3*9+33-6644-12/3+32+99"))   test 

思路 : 首先根据数字的ASCII码来区分数字和符号,是符号就添加到数字栈里面,是符号的话,假如符号栈为空就就入栈,假如符号栈不为空就拿栈顶的符号与当前符号做比较,假如当前符号栈顶的符号优先级低或相同就取栈顶符号与数字栈的栈顶两个数字做运算再把结果放回数字栈,这里一直比较到符号栈为空或者当前符号比栈顶符号优先级高;当当前符号优先级比栈顶符号高是就把当前符号压栈;当表达式遍历完后再处理剩下的数字栈和符号栈

2 . 使用栈来匹配对应的括号

def brackets_stack(brackets_str):
    """使用栈来匹配括号"""

    stack = Stack()
    if len(brackets_str.strip()) == 0 : return True
    for i in brackets_str :
        if i == " " : continue
        if i in "([{":
            stack.push(i)
        else:
            tmp = stack.pop()
            if i == ")" and tmp == "(":
                continue
            elif  i == "]" and tmp == "[":
                continue
            elif i == "}" and tmp == "{":
                continue
            else:
                return False
    if stack.count == 0 :  
        return True
    else :
        return False

#####################################test##################################################
# bracket_test_list = ["{[] ()[{}]}","{[]()[{}]}","[{()}([])]","{[}()]","[({)]","{}[()[]"]
# for i in bracket_test_list :
#     print(brackets_stack(i))     
#########################################################################################

思路 : 假如是括号的左边则入栈,是右半边的话就拿栈顶元素比较,能成对继续,不能就返回False,当执行完后,判定栈里是否还有元素,假如没有的话则说明全部匹配完了

3. 利用栈实现浏览的页面前进后退缓存
 

class BrowsePN:

    def __init__(self):

        self.prev_stack = Stack()
        self.next_stack = Stack()
        self.this_page = None

    def prev_page(self):

        if self.prev_stack.count > 0 :
            self.next_stack.push(self.this_page)
            self.this_page = self.prev_stack.pop()
            return self.this_page
        if self.this_page :
            self.next_stack.push(self.this_page)
            self.this_page = None
        return None

    def next_page(self):

        if self.next_stack.count > 0 :
            self.prev_stack.push(self.this_page)
            self.this_page = self.next_stack.pop()
            return self.this_page
        if self.this_page : # 这里的处理是防止连续点击记下下一页后,把空页加入到上一页栈中
            self.prev_stack.push(self.this_page)
            self.this_page = None
        return None

    def read_page(self,page):

        if self.this_page :
            self.prev_stack.push(self.this_page)
            self.next_stack = Stack()
        self.this_page = page

        return page
#################################---TEST---#################################################
    # b = BrowserPN()
    # b.read_page("a")
    # b.read_page("b")
    # b.read_page("c")
    # b.read_page("d")
    # print(b.prev_page())
    # print(b.next_page())
    # print(b.prev_page())
    # print(b.prev_page())
    # print(b.next_page())
    # b.read_page("cc")
    # print(b.prev_page())
    # print(b.next_page())
    # print(b.next_page())
    # print(b.prev_page())
    # print(b.prev_page())
    # print(b.prev_page())
    # print(b.prev_page())
    # print(b.next_page())
    # print(b.next_page())
    # print(b.next_page())
    # print(b.next_page())
    # print(b.next_page())
    # print(b.prev_page())
#########################################################################################

思路: 当读取一个页面是就把原来的页面放入后退栈里,并清空前进栈 ; 

         当点后退时,就读取后退栈并把当前页放入前进栈里面;

         当点前进时,就读取前进栈并把当前页放入后退栈;边界的话,需要处理下当前页是空的话就不添加进栈里

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值