1,420
社区成员
发帖
与我相关
我的任务
分享
private func evaluate(ops:[Op])->(result:Double?,remainingOps:[Op]){
if !ops.isEmpty{
var remainingOps=ops
let op = remainingOps.removeLast()
switch op {
case .Operand(let operand):
return (operand,remainingOps)
//如果是操作符就进行计算
case .UnaryOperation(_, let operation):
let operandEvaluation = evaluate(remainingOps)
//这个时候符号已经被移除,result是第二个操作数
if let operand=operandEvaluation.result{
return (operation(operand),operandEvaluation.remainingOps)
}
case .BinaryOperation(_, let operation):
let op1Evaluation = evaluate(remainingOps)
if let operand1=op1Evaluation.result{
let op2Evaluation = evaluate(op1Evaluation.remainingOps)
if let operand2 = op2Evaluation.result{
return(operation(operand1,operand2),op2Evaluation.remainingOps)
}
}
}
}
return (nil,ops)
}
func evaluate() -> Double? {
let (result , _)=evaluate(opStack)
return result
}
func pushOperand(operand:Double){
opStack.append(Op.Operand(operand))
return evaluate()
}
func performOperation(symbol:String){
if let operation = knowOps[String]{
opStack.append(operation)
}
return evaluate()
}