# 栈的实现,括号匹配与逆波兰式求值
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特性...结果捣鼓出来了这么些玩意。