Public StaticDouble Getresultfromstr (stringsource) { stringstr =Insertblank (source); stringRpnexperssion =CONVERTTORPN (str); returnGetResult (rpnexperssion); } Private Static DoubleGetValue (DoubleLeftDoubleRightChar_operator) { Switch(_operator) { Case '+': returnleft+Right ; Case '-': returnleft-Right ; Case '*': returnleft*Right ; Case '/': returnleft/Right ; } return 0; } Private Static DoubleGetResult (stringsource) { Try{Source=source. Trim (); Stack<string> stack =Newstack<string>(); varList = source. Split (' '); for(inti =0; I < list. Length; i++) { stringCurrent =List[i]; //bool B = Regex.IsMatch (Strnum, "^[0-9]*{1}quot;); if(Getnum (current)) {stack. Push (current); } Else if(Operatorlevel.containskey (current)) {Doubleright =Double. Parse (Stack. Pop ()); Doubleleft =Double. Parse (Stack. Pop ()); Stack. Push (GetValue (left, right, current[0]). ToString ()); } } stringAAA =stack. Pop (). ToString (); return Double. Parse (AAA); } Catch(Exception e) {}return 0; } Private Static stringCONVERTTORPN (stringsource) { Try{StringBuilder result=NewStringBuilder (); Stack<string> stack =Newstack<string>(); string[] list = source. Split (' '); for(inti =0; I < list. Length; i++) { stringCurrent =List[i]; //if (Regex.IsMatch (current, "^ ([0-9]{1,}) {1}quot;")) if(Getnum (current)) {result. Append ( current+" "); } Else if(Operatorlevel.containskey (current)) {if(Stack. Count >0) { varPrev =stack. Peek (); if(prev = ="(") {stack. Push (current); Continue; } if(Current = ="(") {stack. Push (current); Continue; } if(Current = =")") { while(Stack. Count >0&& stack. Peek ()! ="(") {result. Append (Stack. Pop ()+" "); } //Pop The "("stack. Pop (); Continue; } if(Operatorlevel[current] <Operatorlevel[prev]) { while(Stack. Count >0) { vartop =stack. Pop (); if(Top! ="("&&Top!=")") {result. Append (Top+" "); } Else { Break; }} stack. Push (current); } Else{stack. Push (current); } } Else{stack. Push (current); } } } if(Stack. Count >0) { while(Stack. Count >0) { vartop =stack. Pop (); if(Top! ="("&& Top! =")") {result. Append (Top+" "); } } } returnresult. ToString (). Trim (); } Catch(Exception e) {}return ""; } Private Static stringInsertblank (stringsource) {StringBuilder SB=NewStringBuilder (); varList =source. ToCharArray (); foreach(varTempinchlist) { if(Operatorlevel.containskey (temp. ToString ())) {sb. Append (" "); Sb. Append (temp. ToString ()); Sb. Append (" "); } Else{sb. Append (temp); } } returnsb. ToString (); } Private Staticdictionary<string,int>Operatorlevel {Get { if(_operatorlevel==NULL) {_operatorlevel=Newdictionary<string,int>(); _operatorlevel.add ("+",0); _operatorlevel.add ("-",0); _operatorlevel.add ("(",1); _operatorlevel.add ("*",1); _operatorlevel.add ("/",1); _operatorlevel.add (")",0); } return_operatorlevel; } } /// <summary> ///validation is not a number (contains integers and decimals)/// </summary> /// <param name= "str" ></param> /// <returns></returns> Private Static BOOLGetnum (stringstr) { BOOLb =false; Try { Double. Parse (str); b=true; } Catch(Exception e) {}returnb; } View Code
C # Stack arithmetic