分享一个Swift语言的逆波兰表达式计算器的实现
来源:互联网 发布:蛇蝎美人 知乎 编辑:程序博客网 时间:2024/05/12 04:10
//
// CalculatorBrain.swift
// Calculator
//
// Created by 王卓 on 15/6/10.
// Copyright (c) 2015年 王卓. All rights reserved.
//
import Foundation
class CalculatorBrain {
private enum Op:CustomStringConvertible
{
case Operand(Double)
case UnaryOperation(String,Double->Double)
case BinaryOperation(String,(Double,Double)->Double)
var description:String{
switch self{
case .Operand(let Operand):
return "\(Operand)"
case .UnaryOperation(let symbol, _):
return "\(symbol)"
case .BinaryOperation(let symbol, _):
return "\(symbol)"
}
}
}
private var opStack=[Op]()
private var knowsOps=[String:Op]()
init() {
func learnOp(op:Op){
knowsOps[op.description]=op
}
// ***重点***
// ***闭包***
// switch operation {
// //1最复杂的形式
// case "×":performOperation2({(Double op1,Double op2)->Double in return op1*op2})
// //2
// case "÷":performOperation2({(Double op1,Double op2)->Double in op2/op1})
// //3
// case "+":performOperation2({(op1,op2)->Double in op1+op2})
// //4
// case "−":performOperation2({$1-$0})
// //其他形式performoperation(){$1-$0}
// case "√":performOperation1(){sqrt($0)}
// default:break
// }
//将操作符传入
knowsOps["×"]=Op.BinaryOperation("×", *)
knowsOps["÷"]=Op.BinaryOperation("÷", {$1/$0})
learnOp(Op.BinaryOperation("+", +));
//knowsOps["+"]=Op.BinaryOperation("+", +)
knowsOps["−"]=Op.BinaryOperation("−", {$1-$0})
//将sqrt函数作为参传入
knowsOps["√"]=Op.UnaryOperation("√", sqrt)
}
private func evalucate(ops:[Op])->(result:Double?,remainOps:[Op]){
if !ops.isEmpty{
var remainOps=ops
let op=remainOps.removeLast()
switch op{
case .Operand(let operand):
return (operand,remainOps)
case .UnaryOperation(_, let operation):
let OperandEvalucate = evalucate(remainOps)
if let operand=OperandEvalucate.result{
return (operation(operand),OperandEvalucate.remainOps)
}
case .BinaryOperation(_, let operation):
let op1Evalucate = evalucate(remainOps)
if let operand1=op1Evalucate.result{
let op2Evalucate = evalucate(op1Evalucate.remainOps)
if let operand2=op2Evalucate.result{
return(operation(operand1,operand2),op2Evalucate.remainOps)
}
}
}
}
return(nil,ops)
}
func evalucate()->Double?{
let (result,remainder)=evalucate(opStack)
print("\(opStack) = \(result) with \(remainder) left over")
return result
}
func pushOperand(operand:Double)->Double?{
opStack.append(Op.Operand(operand))
return evalucate()
}
func performOperation(Operation:String)->Double?{
if let operation = knowsOps[Operation]{
opStack.append(operation)
}
return evalucate()
}
}
- 分享一个Swift语言的逆波兰表达式计算器的实现
- 实现逆波兰表达式的java计算器
- 逆波兰计算器的实现
- C语言实现的简单的逆波兰计算器
- 逆波兰表达式思想下的计算器
- 基于逆波兰表达式的计算器
- 用逆波兰表达式的三角函数计算器
- 栈的应用--中缀表达式转换为后缀表达式&逆波兰计算器的实现
- 计算器 | 逆波兰表达式
- 逆波兰表达式计算器
- 逆波兰 计算器 C语言实现代码
- C语言栈实现逆波兰计算器
- 逆波兰 计算器 C语言实现
- 一个C的逆波兰式计算器的问题
- 表达式计算器(逆波兰法)栈操作(C语言实现)
- 逆波兰表达式的c++实现
- 逆波兰表达式的java实现
- 逆波兰实现计算器
- Java并发编程:如何创建线程
- android 禁止listview 的ITEM被点击
- select ... for update& lock in share mode加锁情况
- Android 状态栏沉浸式的实现
- Centos 安装五笔
- 分享一个Swift语言的逆波兰表达式计算器的实现
- 关于解决启动项丢失问题
- [leetcode127]Word Ladder Problem
- Java并发编程:Callable、Future和FutureTask
- 基于bootstrap的简单分页
- String,StringBuffer,StringBuilder
- 字符从键盘输入到在显示器显示出来的详细过程
- Java中I/O流的应用
- 关于Swift2.0提供的try catch异常捕捉的使用方法