首页 > 站长在线 > Iphone表达式计算器

Iphone表达式计算器

下面是用OC写的一个表达式计算器:(思路跟Android表达式计算器差不多。)

1.中缀表达式转后缀表达式

 

[java][/java] view plaincopy

  1. //convert infix Expression into Posfix Expression
  2. -(ExpStack *)infixExpToPostfixExp:(NSString*) infixExp
  3. {
  4.     // get a number ?
  5.     Boolean gerANumber = false;
  6.     // get numbers and operators from nsstring
  7.     char tempChar = ' ';
  8.     NSString *tempStr = @"";
  9.     ExpStack *myStack = [[ ExpStack alloc ] init ];
  10.     for( int i=0; i<[ infixExp length]; i++ )
  11.     {
  12.         tempChar = [ infixExp characterAtIndex:i ];
  13.         //is not a operator
  14.         // when previous characters is number, '-' should be regarded as operator
  15.         // else '-' should be regarded as a part of a number.
  16.         if( (!gerANumber && '-'==tempChar) || ![ self isOperator:tempChar ])
  17.         {
  18.             tempStr = [ tempStr stringByAppendingFormat:@"%c", tempChar];
  19.             // this charachters must be a number
  20.             gerANumber = true;
  21.         }
  22.         else//is a operator
  23.         {
  24.             //push the number to stack
  25.             if( ![tempStr isEqualToString:@""] )
  26.             {
  27.                 [ myStack push:tempStr ];
  28.             }
  29.             //get the operator
  30.             tempStr = @"";
  31.             tempStr = [ tempStr stringByAppendingFormat:@"%c", tempChar];
  32.             [ myStack push:tempStr ];
  33.             //clear tempStr
  34.             tempStr = @"";
  35.             // this charachters must be a Operator
  36.             gerANumber = false;
  37.         }
  38.     }
  39.     if( 0 != [ tempStr length] )
  40.     {
  41.         //push the number to stack
  42.         [ myStack push:tempStr ];
  43.     }
  44.     //debug info
  45.     [ myStack showStack ] ;
  46.     NSLog(@"%@", @"\n-------------------------");
  47.     //upside down mystack (now we get infix expression)
  48.     ExpStack *myinfixExp = [[ ExpStack alloc ] init ];
  49.     while( ![ myStack isEmpty ] )
  50.     {
  51.         [ myinfixExp push: [myStack getTop] ];
  52.         [ myStack pop ];
  53.     }
  54.     //debug info
  55.     [ myinfixExp showStack ] ;
  56.      NSLog(@"%@", @"\n-------------------------");
  57.     //converting (myStack is Empty now)
  58.     //get posfix Expression
  59.     ExpStack *myPosfixExp = [[ ExpStack alloc ] init ];
  60.     while( ![ myinfixExp isEmpty ] )
  61.     {
  62.         tempStr = [ myinfixExp getTop ];
  63.         if( [ self isNumber:tempStr ] )  // is number
  64.         {
  65.             [ myPosfixExp push:tempStr ];
  66.         }
  67.         else if( [ tempStr isEqualToString:@"("] ) // is open brackerts
  68.         {
  69.             [ myStack push:tempStr ];
  70.         }
  71.         else if( [ tempStr isEqualToString:@")"] ) // is close brackerts
  72.         {
  73.             if( [ myStack isEmpty ] )
  74.             {
  75.                 NSLog(@"%@", @"Expression is wrong...");
  76.                 return nil;
  77.             }
  78.             else
  79.             {
  80.                 while(  ![ [ myStack getTop ] isEqualToString:@"(" ] )
  81.                 {
  82.                     [ myPosfixExp push: [myStack getTop] ];
  83.                     [ myStack pop ];
  84.                     if ( [ myStack isEmpty ] )
  85.                     {
  86.                         NSLog(@"%@", @"Expression is wrong...");
  87.                         return nil;
  88.                     }
  89.                 }
  90.                 if( [[myStack getTop] isEqualToString:@"("] )
  91.                 {
  92.                     [myStack pop];
  93.                 }
  94.             }
  95.         }
  96.         else if ( [self isCaculaOperator:tempStr] ) // is caculate operator
  97.         {
  98.             /*int operatorcompareResult = [ self compareCaculatorOperator:[myStack getTop] :tempStr ];
  99.             if( -1 == operatorcompareResult )
  100.             {
  101.                 NSLog(@"%@ infixExp Operator: %@ Stack Operator: %@", @"wrong caculator operator: ",
  102.                       tempStr, [myStack getTop]);
  103.                 return nil;
  104.             }
  105.             */
  106.             while ( (![ myStack isEmpty]) &&
  107.                     (![[ myStack getTop ] isEqualToString:@"(" ]) &&
  108.                    (  [ self compareCaculatorOperator:[myStack getTop] :tempStr ] > 0 ) )
  109.             {
  110.                 [ myPosfixExp push: [myStack getTop] ];
  111.                 [ myStack pop ];
  112.             }
  113.             [ myStack push:tempStr ];
  114.         }
  115.         [ myinfixExp pop ];
  116.     }
  117.     while( ![myStack isEmpty ])
  118.     {
  119.         if( [[myStack getTop ] isEqualToString:@"(" ])
  120.         {
  121.             NSLog(@"%@", @"Expression is wrong...");
  122.             return nil;
  123.         }
  124.         [ myPosfixExp push:[myStack getTop] ];
  125.         [ myStack pop ];
  126.     }
  127.     //debug info
  128.     [myPosfixExp showStack ] ;
  129.     NSLog(@"%@", @"\n-------------------------");
  130.     return myPosfixExp;
  131. }

 

2.计算表达式的值:

[java][/java] view plaincopy

  1. // caculate the expression
  2. -(double) caculate
  3. {
  4.     // remember caculte string
  5.     undoStr = caculateTextView.text;
  6.     //through filter we get infix Expression
  7.     NSString *infixExp = [self caculateStrFilter:caculateTextView.text];
  8.     ExpStack *myStack = [self infixExpToPostfixExp: infixExp];
  9.     if( nil == myStack )
  10.     {
  11.         [ self showError:@"Error" ];
  12.         NSLog(@"%@", @"Expression is wrong...");
  13.         return 0;
  14.     }
  15.     //caculate Expression value
  16.     ExpStack *posfixStack = [[ ExpStack alloc ] init ];
  17.     // up side down stack, get posfix expression
  18.     while( ![ myStack isEmpty ])
  19.     {
  20.         [posfixStack push:[ myStack getTop] ];
  21.         [myStack pop];
  22.     }
  23.     //debug info
  24.     [ posfixStack showStack ] ;
  25.     NSLog(@"%@", @"\n-------------------------");
  26.     // now myStack is empty, caculate resulte using posfix expression
  27.     NSString *numberStr1 = @"";
  28.     NSString *numberStr2 = @"";
  29.     while( ![posfixStack isEmpty ])
  30.     {
  31.         if(  [ self isNumber:[posfixStack getTop ] ] )
  32.         {
  33.             [ myStack push:[posfixStack getTop] ];
  34.         }
  35.         else if ( [ self isCaculaOperator:[posfixStack getTop] ] )
  36.         {
  37.             numberStr1 = [myStack getTop];
  38.             [myStack pop ];
  39.             numberStr2 = [myStack getTop];
  40.             [myStack pop ];
  41.             // caculate
  42.             if( [[posfixStack getTop] isEqualToString:@"+" ])
  43.             {
  44.                 double temDou = [numberStr1 doubleValue] + [numberStr2 doubleValue];
  45.                 numberStr1 = @"";
  46.                 numberStr1 = [ numberStr1 stringByAppendingFormat:@"%.15f", temDou ];
  47.                 [ myStack push:numberStr1 ];
  48.             }
  49.             else if( [[posfixStack getTop] isEqualToString:@"-"])
  50.             {
  51.                 double temDou = [numberStr2 doubleValue] - [numberStr1 doubleValue];
  52.                 numberStr1 = @"";
  53.                 numberStr1 = [ numberStr1 stringByAppendingFormat:@"%.15f", temDou ];
  54.                 [ myStack push:numberStr1 ];
  55.             }
  56.             else if( [[posfixStack getTop] isEqualToString:@"*"])
  57.             {
  58.                 double temDou = [numberStr1 doubleValue] * [numberStr2 doubleValue];
  59.                 numberStr1 = @"";
  60.                 numberStr1 = [ numberStr1 stringByAppendingFormat:@"%.15f", temDou ];
  61.                 [ myStack push:numberStr1 ];
  62.             }
  63.             else if( [[posfixStack getTop] isEqualToString:@"/"])
  64.             {
  65.                 double temDou = [numberStr1 doubleValue];
  66.                 if( temDou-0 < 1e-20)
  67.                 {
  68.                     [ self showError:@"inf" ] ;
  69.                     NSLog(@"%@", @"Cannot divide 0...");
  70.                     return 0.;
  71.                 }
  72.                 temDou = [numberStr2 doubleValue] / temDou;
  73.                 numberStr1 = @"";                                 /* there is different */
  74.                 numberStr1 = [ numberStr1 stringByAppendingFormat:@"%.15f", temDou ];
  75.                 [ myStack push:numberStr1 ];
  76.             }
  77.             else if( [[posfixStack getTop] isEqualToString:@"^"])
  78.             {
  79.                 double temDou = pow( [numberStr2 doubleValue], [numberStr1 doubleValue] );
  80.                 numberStr1 = @"";
  81.                 numberStr1 = [ numberStr1 stringByAppendingFormat:@"%.15f", temDou ];
  82.                 [ myStack push:numberStr1 ];
  83.             }
  84.         }
  85.         [posfixStack pop];
  86.     }
  87.     if( 1 != myStack.size )
  88.     {
  89.         [ self showError:@"Error" ];
  90.         NSLog(@"%@", @"Stack Size Error...");
  91.     }
  92.     else//show resulte
  93.     {
  94.         if( enableScientificNotation )
  95.         {
  96.             [ self showResultWhenEnableSN:[ myStack getTop ]];
  97.         }
  98.         else
  99.         {
  100.             [ self showResult:[ myStack getTop ] ];
  101.         }
  102.         NSLog(@"\n%@%@", @"-----------Result:", [myStack getTop]);
  103.     }
  104.     return 0.;
  105. }

.M文件:

http://pan.baidu.com/share/link?uk=1158831200&shareid=783048007


本文固定链接: http://www.devba.com/index.php/archives/2439.html | 开发吧

Iphone表达式计算器:目前有3 条留言

  1. 地板
    nfl jerseys for women:

    Iphone表达式计算器

    2013-11-27 上午 4:17
  2. 板凳
    時計:

    请问一下你QQ多少? 想请教一下 可以加我的QQ

    2013-10-16 上午 10:35
  3. 沙发
    joke:

    谢谢分享!

    2013-10-11 下午 4:49