oc 计算 带括号 式子
生活随笔
收集整理的這篇文章主要介紹了
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 = 0; i<StringToCompute.length; i++) {if([StringToCompute characterAtIndex:i]=='('){NSString * str = [StringToCompute substringWithRange:NSMakeRange(0, i)];[myStack push:str];NSString *strtemp = [StringToCompute substringWithRange:NSMakeRange(i+1, StringToCompute.length-i-1)];StringToCompute = [[NSMutableString alloc]initWithString:strtemp];break;}if([StringToCompute characterAtIndex:i]==')'){NSString *strTemp = [StringToCompute substringToIndex:i];StringToCompute =[StringToCompute substringWithRange:NSMakeRange(i+1,StringToCompute.length-i-1)];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-1){
//已沒有括號
? ? ? ? ? ? ? ? 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 = 1; i<strTmp.length; i++) {char c= [strTmp characterAtIndex:i];if(c=='+'||c=='-'||c=='*'||c=='/'){
//拆開式子NSString * temp = [strTmp substringWithRange:NSMakeRange(0, i)];[array addObject:temp];temp = [strTmp substringWithRange:NSMakeRange(i, i)];[array addObject:temp];strTmp = [strTmp substringWithRange:NSMakeRange(i+1, strTmp.length - i-1)];if(strTmp.length<=1){needContinue = false;[array addObject:strTmp];}break;}}if(!needContinue){break;}}// NSLog(@"%@",array);while (true) {
//做 * 和 /Boolean needFinish = false;for (int i =0 ; i< array.count ; i++) {if([array[i] isEqual:@"/"]||[array[i] isEqual:@"*"]){NSNumber *left = array[i-1];NSNumber *right = array[i+1];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-1];NSLog(@"%@",array);[array removeObjectAtIndex:i];NSLog(@"%@",array);break;}if (i==array.count -1){needFinish = true;}}if(needFinish){NSLog(@"%@",array);break;}}while (true) {Boolean needFinish = false;
//做 + 和 - 運算for (int i =0 ; i< array.count ; i++) {if([array[i] isEqual:@"+"]||[array[i] isEqual:@"-"]){NSNumber *left = array[i-1];NSNumber *right = array[i+1];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-1];NSLog(@"%@",array);[array removeObjectAtIndex:i];NSLog(@"%@",array);break;}if (i==array.count -1){needFinish = true;}}if(needFinish){NSLog(@"%@",array);break;}}return (NSNumber*)array[0];}@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 = -1 ;for (int i =0; i< [self length]; i++) {if('c'== [self characterAtIndex:i]){index = i ;break;}}return index ; }-(int) lastIndexOf:(char)c {int index = -1 ;for (int i =0; 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 0; }?
匹配括號的思想是棧的使用。遇左括號截取對應部分壓棧,遇右括號出棧并計算替換。
沒有檢查合法性。沒有做代碼優化。
?
轉載于:https://www.cnblogs.com/mamamia/p/8718547.html
總結
以上是生活随笔為你收集整理的oc 计算 带括号 式子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下的定时任务 每天0点重置 t
- 下一篇: 综合-某假期欢乐赛 (Apri, 201