关于中缀表达式转后缀表达式 然后求值问题的实现

来源:互联网 发布:千牛for mac版 编辑:程序博客网 时间:2024/05/21 16:10

最近上一篇说到了关于算术表达式求值问题,上面已经大致有了思路,因为关于IOS的实现是在公司电脑上面写的,基本上已经知道怎么实现了,IOS可以实现关于多位数的运算,而下面是两种语言的实现。不过都只是实现了关于10以内的数字的运算.包括java实现以及c++语言的实现。

java实现:

   Stack<Character> stack = new Stack<Character>();         String str = "3+4+5/6";      StringBuffer stringBuffer = new StringBuffer();      for (int i = 0; i < str.length(); i++) {if(Character.isDigit(str.charAt(i))) {stringBuffer.append(str.charAt(i));}else {boolean isHighLevel = str.charAt(i) == '*' || str.charAt(i) =='/';Character ch = null;if(stack.isEmpty()) {stack.push(str.charAt(i));}else if(isHighLevel && ((ch =stack.pop()) == '+' || ch =='-')){stack.push(ch);stack.push(str.charAt(i));}else {stringBuffer.append(stack.pop());stack.push(str.charAt(i));}}      }            while (!stack.isEmpty()) {stringBuffer.append(stack.pop());  }      System.out.println(stringBuffer.toString());            String afterString = stringBuffer.toString();      Stack<Double> intStack = new Stack<Double>();      double result=0;      for (int i = 0; i < afterString.length(); i++) {  if(Character.isDigit(afterString.charAt(i))) {  intStack.push(Double.valueOf(afterString.charAt(i)+""));  }else {  Double top = intStack.pop();  Double second = intStack.pop();  switch(afterString.charAt(i))  {  case '*':  result = top * second;  break;  case '/':  result = second / top;  break;  case '+':  result = top + second;  break;  case '-':  result = second - top;  break;  }  intStack.push(result);  }      }      System.out.println(intStack.pop());}

C++实现:

#include "stdafx.h"#include <stack>#include<iostream>#include <ctype.h>using namespace std;void change(stack<char> & stack1,char * c,int size);bool isoperator(char c);int priorityLevel(char c);int _tmain(int argc, _TCHAR* argv[]){stack<char> stack1;stack<char> stack2;char * ch="(1+2)*3+4*6=";change(stack1,ch,strlen(ch));return 0;}void change(stack<char> & stack1,char * ch ,int size){for(int i=0;i<size;i++){char c=ch[i];    if(isdigit(c))    { cout<<c<<" ";    }else if(isoperator(c))    { if(stack1.empty()) {stack1.push(c); }else if(priorityLevel(c)<=priorityLevel(stack1.top())) {   cout<<stack1.top()<<" ";   stack1.pop();   stack1.push(c);  }else if(priorityLevel(c)>priorityLevel(stack1.top()) && priorityLevel(c)!=4 ) {stack1.push(c);  }else if(priorityLevel(c)>priorityLevel(stack1.top()) && priorityLevel(c)==4 ) {while(!stack1.empty() && stack1.top()!='('){cout<<stack1.top()<<" ";stack1.pop();    }if(stack1.empty()){exit(0);}  }   }else   {  while(!stack1.empty()){cout<<stack1.top()<<" ";stack1.pop();}   }}}bool isoperator(char c){if(c=='+'|| c=='-'|| c=='*' || c=='/' || c=='(' ||c==')'){return true;}else{return false;}}int priorityLevel(char c){switch(c){case '+':case '-':return 1;case '*':case '/':return 2;case '(':return 0;case ')':return 4;default:return -1;}}
回头可以考虑一下关于多位数运算java和c语言的实现。IOS能够实现主要是有一个系统函数:[123+3/2 doubleValue] 就可以返回123这个,而不用自己去解析之后再处理.

0 0
原创粉丝点击