Python实现栈及其简单应用

Python实现栈


定义栈类

class Stack(object):
    # 初始化栈为空列表
    def __init__(self):
        self.items = []

    # 判断栈是否为空,返回布尔值
    def is_Empty(self):
        return self.items == []

    # 返回栈顶元素
    # 如果为空返回None
    def peek(self):
        if self.is_Empty():
            return None
        return self.items[len(self.items) - 1]

    # 返回栈大小
    def size(self):
        return len(self.items)	

    # 压栈,添加新元素进栈
    def push(self, item):
        self.items.append(item)

    # 出栈,删除栈顶元素
    def pop(self):
        return self.items.pop()

简单的栈测试

if __name__ == "__main__":

    # 初始化一个栈对象
    my_stack = Stack()

    my_stack.push('h')
    print("压栈:{}".format(my_stack.peek()))
    my_stack.push('a')
    print("压栈:{}".format(my_stack.peek()))

    print("此时栈大小为:{},栈顶元素为:{}".format(my_stack.size(), my_stack.peek()))
    print("出栈:{}".format(my_stack.pop()))
    print("栈是否为空:{}".format(my_stack.is_Empty()))

    print("此时栈大小为:{},栈顶元素为:{}".format(my_stack.size(), my_stack.peek()))
    print("出栈:{}".format(my_stack.pop()))
    print("栈是否为空:{}".format(my_stack.is_Empty()))

    print("此时栈大小为:{},栈顶元素为:{}".format(my_stack.size(), my_stack.peek()))
    print("栈是否为空:{}".format(my_stack.is_Empty()))
    
    """
    压栈:h
    压栈:a
    
    此时栈大小为:2,栈顶元素为:a
    出栈:a
    栈是否为空:False
    
    此时栈大小为:1,栈顶元素为:h
    出栈:h
    栈是否为空:True
    
    此时栈大小为:0,栈顶元素为:None
    栈是否为空:True
    """

栈应用——检测字符串中的括号是否成对

def syntaxChecker(string):
    stack = Stack()
    opens = '([{'
    closes = ')]}'
    balanced = True
    for i in string:
        if i in '([{':
            stack.push(i)
        elif i in ')]}':
            if stack.is_Empty():
                balanced = False
                break
            else:
                j = stack.pop()
                if opens.find(i) != closes.find(j):
                    balanced = False
                    break
    if not stack.is_Empty():
        balanced = False
    return balanced
  • 首先创建一个栈对象,并新建一个包含所有左括号的数组和一个包含所有右括号的数组(注意同种括号下标需要对应),接着讲匹配状态设为True
  • 然后对输入的字符串进行判断
    • 如果匹配到左括号,则压栈
    • 如果匹配到右括号
      • 如果此时栈为空,匹配状态设为False,因为空栈缺少左括号肯定是不匹配
      • 如果栈不为空,则出栈当前的栈顶元素,如果此时符号类型匹配,则确定是一组括号
    • 循环直到无法匹配到括号
    • 最后判断如果栈不为空,则匹配失败,如果匹配成功则匹配状态不做修改仍为True
  • 返回匹配状态

栈应用——十进制转换为二进制

def decimal_to_bin(dec):
    stack = Stack()
    bin_str = ''
    if dec == 0:
        stack.push(0)
    while dec > 0:
        a = dec % 2
        stack.push(a)
        dec = int(dec / 2)
    while not stack.is_Empty():
        bin_str += str(stack.pop())
    return bin_str
  • 首先创建一个栈对象,和一个存储二进制数的字符串,函数传入待转换的十进制数
  • 提前判断该数是不是0,如果是0则直接压栈0
  • 非零则开始执行转换操作
    • 将十进制数%2后的结果压入栈
    • 然后将十进制数/2得到新的数
    • 如此循环直到所得十进制数小于一
    • 注意这个过程中为了避免小数所以执行了强制类型转换
  • 循环结束后如果栈不为空,则将之前压栈的元素全部按顺序出栈组成一个二进制的字符串,返回之
  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值