日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oc 计算 带括号 式子

發(fā)布時(shí)間:2025/4/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oc 计算 带括号 式子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面代碼實(shí)現(xiàn)可以計(jì)算 類似以下的字符竄。

@"(1+2*(3+4)+3)/2"

?

自寫一個(gè)簡單 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

?

編寫計(jì)算類

?

#import "NSString+index.h" #import <Foundation/Foundation.h>@interface MyCalculater : NSObject
//計(jì)算子竄,沒有括號(hào)的式子
+(NSNumber*)calculate:(NSString*) str;
//計(jì)算總竄
+(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){

//已沒有括號(hào)

? ? ? ? ? ? ? ? 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 {//計(jì)算沒有括號(hào)的式子。1.分離式子,分個(gè)因子放到數(shù)組。2.找到符號(hào)位,做左右兩邊計(jì)算,結(jié)果用來替換原來符號(hào)位,刪除左右兩個(gè)計(jì)算數(shù)。
NSMutableArray
* array = [[NSMutableArray alloc]init];while (true) {//先計(jì)算 * / 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] ;}//替換符號(hào)位,刪除左右元素。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;
     //做 + 和 - 運(yùn)算
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

?

擴(kuò)展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 方法中調(diào)用。

#import "MyCalculater.h"int main(int argc, const char * argv[]) {@autoreleasepool {NSLog(@"%@",[MyCalculater compute:@"(1+2*(3+4)+3)/2"]);}return 0; }

?

匹配括號(hào)的思想是棧的使用。遇左括號(hào)截取對應(yīng)部分壓棧,遇右括號(hào)出棧并計(jì)算替換。

沒有檢查合法性。沒有做代碼優(yōu)化。

?

轉(zhuǎn)載于:https://www.cnblogs.com/mamamia/p/8718547.html

總結(jié)

以上是生活随笔為你收集整理的oc 计算 带括号 式子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。