【从零开始学算法】数据结构之栈

本文介绍数据结构中的栈,使用Python进行实现。通过后进先出(LIFO)原则,讨论栈在括号匹配和十进制转二进制问题中的应用。并提供了相关代码示例,进阶思考拓展了匹配多种括号和转换不同进制的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文采用python作为编程语言

什么是栈:栈是一种线性数据结构,遵循Last in First out(后进先出)原则。

栈的代码实现(以-1为栈顶):

class Stack:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def size(self):
        return len(self.items)

栈的运用:

1.简单的括号匹配:()这是一对正确的圆括号,(()))这是一对不正确的圆括号,如何利用算法实现判断这对括号是否正确。

思路:每一个右括号必定有一个左括号相对应,利用栈的后进先出可以完美的解决这个问题,扫描案例时,遇到左括号就压入栈,遇到右括号就将栈内左括号删除,扫描完成后栈内为空则返回True,栈内还存在左括号或扫描过程遇到右括号时栈内为空则返回False

代码实现:

from Stack import Stack
def parCheck(text):
    s = Stack()
    balance = True
    index = 0
    while index < len(text) and balance:  #遍历案例
        symbol = text[index]
        if symbol == "(":   #扫描到左括号,压入栈
            s.push(symbol)
        else:
            if s.isEmpty():  #扫描到右括号但是栈内为空,匹配失败
                balance = False
            else:
                s.pop()  #栈内删除左括号
        index += 1
    if balance and s.isEmpty():  #扫描结束,栈内为空,匹配成功
        return True
    else:
        return False

print(parCheck('((('))

进阶思考:如何同时匹配花括号,圆括号和方括号

2.十进制转化为二进制:一个十进制的数字,如233,利用算法将其转化为二进制的数字11101001 

思路:233是2*10^2+3*10^1+3*10^0,11101001是1*2^7+1*2^6+1*2^5+0*2^4+1*2^3+0*2^2+0*2^1+1*2^0=233,二者相等,所以我们采用除二求余数法。但得到余数是从小到大排序,而我们需要输出是从大到小的输出,所以就可以用到栈的方法。

代码实现:

def change(text):
    ans = Stack()
    while text > 0:
        ans.push(text%2) #求余数
        text = text // 2 #求整数
    answer = ''  #准备空字符集接收数据,用来返回二进制数字
    while not ans.isEmpty():
        answer += str(ans.pop()) #利用栈的弹出,从大到小输出
    return int(answer)

进阶思考:其实无论是2进制还是8进制还是16进制,都可以采用除n求余数法,只需记住输出与输入次序相反,需要栈来实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值