oc 计算 带括号 式子
下面代码实现可以计算 类似以下的字符窜。
@"(1+2*(3+4)+3)/2"
自写一个简单 stack 。不知道 OC为什么不提供Stack类。
#import <Foundation/Foundation.h> @interface MyStack : NSObject
{ }
@property NSMutableArray* mArray ; @property int size ; -(id) pop ; -(void) push:(id)obj ; -(MyStack* )init ;
@end
#import "MyStack.h" @implementation MyStack @synthesize mArray ; @synthesize size ; -(id) pop {
id temp =mArray.lastObject ;
[mArray removeLastObject] ;
return temp ;
} -(void) push:(id)obj {
if(mArray!=nil && obj !=nil){
[mArray addObject:obj ];
}
} -(MyStack* )init { self = [super init];
if(self!=nil&&self.mArray ==nil){
self.mArray = [[NSMutableArray alloc]init];
}
return self ;
}
@end
编写计算类
#import "NSString+index.h"
#import <Foundation/Foundation.h> @interface MyCalculater : NSObject
//计算子窜,没有括号的式子
+(NSNumber*)calculate:(NSString*) str;
//计算总窜
+(NSNumber*)compute:(NSString*)StringToCompute ;
@end//
// MyCalculater.m
// hellowWorld
//
// Created by hongtao on 2018/4/4.
// Copyright © 2018年 hongtao. All rights reserved.
// #import "MyCalculater.h"
#import "MyStack.h" @implementation MyCalculater +(NSNumber*)compute:(NSString*)StringToCompute { MyStack *myStack = [[MyStack alloc]init];
NSNumber * result =nil;
while (true) {
Boolean needFinish = false; for (int i = ; i<StringToCompute.length; i++) {
if([StringToCompute characterAtIndex:i]=='('){
NSString * str = [StringToCompute substringWithRange:NSMakeRange(, i)]; [myStack push:str]; NSString *strtemp = [StringToCompute substringWithRange:NSMakeRange(i+, StringToCompute.length-i-)]; StringToCompute = [[NSMutableString alloc]initWithString:strtemp]; break;
} if([StringToCompute characterAtIndex:i]==')'){
NSString *strTemp = [StringToCompute substringToIndex:i];
StringToCompute =[StringToCompute substringWithRange:NSMakeRange(i+,StringToCompute.length-i-)];
NSMutableString * mstr = [[NSMutableString alloc]init];
[mstr appendString:[myStack pop] ];
[mstr appendString:[[MyCalculater calculate:strTemp] stringValue]] ;
[mstr appendString:StringToCompute];
StringToCompute = [mstr copy];
mstr = nil;
break;
} if(i==StringToCompute.length-){
//已没有括号
if([StringToCompute containsString:@"+"]||[StringToCompute containsString:@"-"]||[StringToCompute containsString:@"*"] ||[StringToCompute containsString:@"/"])
{
result= [MyCalculater calculate:StringToCompute];
NSLog(@"result:%@",result );
}else{
result =StringToCompute ;
NSLog(@"result:%@", StringToCompute);
}
needFinish = true;
}
}
if(needFinish){
break;
} } return nil ;
} +(NSNumber*)calculate:(NSString*) strTmp {
//计算没有括号的式子。1.分离式子,分个因子放到数组。2.找到符号位,做左右两边计算,结果用来替换原来符号位,删除左右两个计算数。
NSMutableArray* array = [[NSMutableArray alloc]init];
while (true) {
//先计算 * /
Boolean needContinue = true;
for (int i = ; i<strTmp.length; i++) {
char c= [strTmp characterAtIndex:i];
if(c=='+'||c=='-'||c=='*'||c=='/'){
//拆开式子
NSString * temp = [strTmp substringWithRange:NSMakeRange(, i)];
[array addObject:temp];
temp = [strTmp substringWithRange:NSMakeRange(i, i)];
[array addObject:temp];
strTmp = [strTmp substringWithRange:NSMakeRange(i+, strTmp.length - i-)];
if(strTmp.length<=){
needContinue = false;
[array addObject:strTmp];
}
break;
}
} if(!needContinue){
break;
} }
// NSLog(@"%@",array); while (true) {
//做 * 和 /
Boolean needFinish = false;
for (int i = ; i< array.count ; i++) {
if([array[i] isEqual:@"/"]||[array[i] isEqual:@"*"]){
NSNumber *left = array[i-];
NSNumber *right = array[i+];
double result = 0.0 ;
if([array[i] isEqual:@"/"]){
result = [left doubleValue]/[right doubleValue] ;
}
if([array[i] isEqual:@"*"]){
result = [left doubleValue]*[right doubleValue] ;
} //替换符号位,删除左右元素。
array[i]=@(result);
NSLog(@"%@",array);
[array removeObjectAtIndex:i-];
NSLog(@"%@",array);
[array removeObjectAtIndex:i];
NSLog(@"%@",array);
break;
}
if (i==array.count -){
needFinish = true;
}
} if(needFinish){
NSLog(@"%@",array);
break;
}
} while (true) {
Boolean needFinish = false;
//做 + 和 - 运算
for (int i = ; i< array.count ; i++) {
if([array[i] isEqual:@"+"]||[array[i] isEqual:@"-"]){
NSNumber *left = array[i-];
NSNumber *right = array[i+];
double result = 0.0 ;
if([array[i] isEqual:@"+"]){
result = [left doubleValue]+[right doubleValue] ;
}
if([array[i] isEqual:@"-"]){
result = [left doubleValue]-[right doubleValue] ;
} //基本与上面同理。
array[i]=@(result);
NSLog(@"%@",array);
[array removeObjectAtIndex:i-];
NSLog(@"%@",array);
[array removeObjectAtIndex:i];
NSLog(@"%@",array);
break;
}
if (i==array.count -){
needFinish = true;
}
} if(needFinish){
NSLog(@"%@",array);
break;
}
} return (NSNumber*)array[]; } @end
扩展NSString 方法,竟然没有 indexof lastIndexOf 方法。自写。
#import <Foundation/Foundation.h> @interface NSString (index)
-(int) indexOf:(char)c ;
-(int) lastIndexOf:(char)c ;
@end
#import "NSString+index.h" @implementation NSString (index)
-(int) indexOf:(char)c {
int index = - ;
for (int i =; i< [self length]; i++) {
if('c'== [self characterAtIndex:i]){
index = i ;
break;
}
}
return index ;
} -(int) lastIndexOf:(char)c {
int index = - ;
for (int i =; i< [self length]; i++) {
if('c'== [self characterAtIndex:i]){
index = i ;
}
}
return index ;
} @end 可以是类方法,这里就不改了。
main 方法中调用。
#import "MyCalculater.h" int main(int argc, const char * argv[]) {
@autoreleasepool { NSLog(@"%@",[MyCalculater compute:@"(1+2*(3+4)+3)/2"]); }
return ;
}
匹配括号的思想是栈的使用。遇左括号截取对应部分压栈,遇右括号出栈并计算替换。
没有检查合法性。没有做代码优化。
oc 计算 带括号 式子的更多相关文章
- 使用python开发一个能够计算带括号的复杂表达式的计算器(只支持加减乘除)
使用到了模块re,正则,字典等 # 实现简单的加减乘除括号等运算 # Calculator def calculator(expression): print(expression) import r ...
- 算法进阶面试题06——实现LFU缓存算法、计算带括号的公式、介绍和实现跳表结构
接着第四课的内容,主要讲LFU.表达式计算和跳表 第一题 上一题实现了LRU缓存算法,LFU也是一个著名的缓存算法 自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) ...
- Python带括号的计算器
带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走 我会努力加油 将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...
- 修改phpcms会员登录后头部登陆条的会员名称不带括号
phpcms会员登录后显示会员名称是带括号的,现在把他修改成不带括号. 找到函数库libs/functions/global.func.php,修改如下即可: function get_nicknam ...
- c++ new带括号和不带括号
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说, ...
- [转]c++ new带括号和不带括号
ref:http://m.blog.csdn.net/blog/u012745772/42420443 在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base ...
- js中new函数后带括号和不带括号的区别
用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...
- 解决VS Code开发Python3语言自动补全功能不带括号的问题
Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...
- Eclipse中Server视图加载项目之后项目名后边有带括号的名字
用习惯了eclipse工具,因为某种原因需要修改项目名称.结果选择项目,按“F2”成功修改后,使用tomcat进行web发布时,选择“Add and Remove”,发现名字还是以前那个项目名称.即使 ...
随机推荐
- element-ui 中 el-table 根据scope.row行数据变化动态显示行内控件
加入本行的数据为scope.row,其数据格式为 { "propertyId": 4, "propertyName": "标题", &quo ...
- Wxpython pannel切换
演示效果 实现panel切换思路 1.创建所有在某个区域需要切换面板对象,设置为None self.panel_Celan1 = None self.panel_Celan2 = None self. ...
- idea 党用快捷键
实用快捷键: Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*...*/ )Ctrl+D 复制行Ctrl+X 删除行快速修复 alt+enter (modify/cast)代码提示 a ...
- shell中$(( ))、$( )、``与${ }的区别详解
命令替换在bash中,$( )与` `(反引号)都是用来作命令替换的.命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行 [python@m ...
- 如何解决Win10系统更新显示0x80080300代码的错误?
Win10系统自推出以来就不断的在完善更新,其越来越丰富的功能也吸引了越来越多的用户.好系统Win10系统:https://www.vkebao.com/os/index_2.html但最近有用户反映 ...
- stackstorm docker中配置ssh免密码登录方式
在docker中配置st2的ssh登录方式折腾了好久,今天终于彻底搞懂了如何重启容器后也不丢失之前的配置,只要容器起来后就可以正常ssh 执行st2中的remote-shell-script 和rem ...
- Docker_云计算技术简述
Docker官方网站 > https://www.docker.com/Docker博客 > https://www.docker.com/blog/Docker内容库 > http ...
- servlet遇到的问题
1 创建web项目没有xml自动生成 2 servlet 忽然报奇怪500错误 出现的BUG原因 JAVA bean没有设置 自动导入了其他User包
- 1.Lucene简介
1.Lucene简介 Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能 Lucene是开源项目,它是可扩展,高性能的库用于索引和搜 ...
- 运行TensorFlow代码时报错
运行TensorFlow代码时报错 错误信息ImportError: libcublas.so.10.0: cannot open shared object file 原因:TensorFlow版本 ...