关于中缀表达式转后缀表达式 然后求值问题的实现
来源:互联网 发布:千牛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
- 关于中缀表达式转后缀表达式 然后求值问题的实现
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 表达式计算(中缀转后缀,然后求值)
- 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
- 中缀表达式转后缀,以及后缀表达式的求值
- C语言 实现中缀表达式转后缀表达式并求值
- C++实现中缀表达式转后缀表达式并求值
- 中缀 后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式 求值
- 中缀转后缀 和 后缀表达式求值
- 中缀表达式转后缀表达式求值(栈的应用)
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- alfresco 系统安装
- Spark RDD API详解(一) Map和Reduce (zhuan)
- 第十三周项目1-数组大折腾3
- poj 2973 无序字符串含通配符的匹配
- 磁盘管理,磁盘挂在mount,挂载光盘镜像文件,挂在U盘,umount 卸载命令, dd
- 关于中缀表达式转后缀表达式 然后求值问题的实现
- UVa 11729 - Commando War
- java设计编码字符串补零方法
- Ajax例子
- android之activity生命周期
- 结合IE9的开发者工具取得动态网页的html代码
- 程序员
- JCombobox使用方法
- hdu-2063 二分图