(烂活)使用Julia实现括号匹配与逆波兰式求值

# 栈的实现,括号匹配与逆波兰式求值
mutable struct MyStack{T}
    my_stack::T
end
function my_pop!(x::MyStack)
    deleteat!(x.my_stack, length(x.my_stack))
end
function my_push(x::MyStack, n)
    push!(x.my_stack, n)
end
function my_top(x::MyStack)
    return x.my_stack[end]
end
# 括号匹配
test1 = ["(", "(", "(", ")", ")", ")"] 
test2 = ["(", ")", "(", ")"]
test3 = ["(", "(", "(", "(", ")"]
function bracket_match(x::Vector{String})
    S::MyStack = MyStack{Vector{String}}([])
    for i = 1:length(x)
        # 左括号进栈
        if x[i] == "("
            my_push(S, x[i])
        elseif x[i] == ")"
            # 右括号遇到左括号相互抵消,若不能抵消则括号不匹配
            if my_top(S) == "("
                my_pop!(S)
            else
                return false
            end
        end
    end
    # 若栈非空,则说明有未抵消的括号
    return isempty(S.my_stack)
end
# 逆波兰式求值
# 这个实例来自邓俊辉版数据结构的98页
test_Polish = [0, "!", 1, "+", 2, 3,"!", 4, "+", "^", "*", 5, "!", 67, "-", 8, 9, "+", "-", "-"]
function rpnEvaluation(x::Vector)
    S::MyStack = MyStack{Vector{Any}}([])
    for i = 1:length(x)
        if typeof(x[i]) <: Number
            # 如果是数字,入栈
            my_push(S, x[i])
        elseif x[i] == "!"
            # 如果是阶乘,计算栈顶的阶乘再入栈
            temp = factorial(my_top(S))
            my_pop!(S)
            my_push(S, temp)
        else
            # 如果是二元运算,则提取两个栈顶数字,计算结果并进栈
            temp1 = my_top(S)
            my_pop!(S)
            temp2 = my_top(S)
            my_pop!(S)
            my_push(S, bi_value(temp2, temp1, x[i]))
        end
    end
    # 最后一个数字是结果
    return my_top(S)
end
function bi_value(a::Number, b::Number, op::String)
    # 计算加减乘除与乘方等二元运算的结果
    if op == "+"
        return a + b
    elseif op == "-"
        return a - b
    elseif op == "*"
        return a * b
    elseif op == "/"
        return a / b
    elseif op == "^"
        return a ^ b
    end
end

闲来无事想复习一下数据结构,顺带熟悉Julia特性...结果捣鼓出来了这么些玩意。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值