原理:

1.将中序表达式变化兴许表达式

2.当前字符为数字,将该数字放入栈中

3.当前字符为操作符,从栈中取出两个树,依据操作符来运算,将运算结果放入到栈中

4.反复,直到将字符操作完。此时栈中仅仅剩下一个元素,即要运算的结果

PS:我没有处理。仅仅能够执行10以内的运算,假设有须要能够扩展

      

package com.lip.datastructure.tree;

import java.util.Iterator;
import java.util.Stack; public class Calculator
{ public static void main(String[] args)
{
String obj = "a*(b+c)+c/d";
String obj1 = "2*(1+3)+9/3"; System.out.println(obj1+"="+calculator(obj1)); }
//利用后序表达式计算
///原理:1.当期字符为字母或者数字,则直接入栈
// 2.当前字符为操作符则从栈中取出两个数字计算
// 3.将计算结果再放入到栈中,栈中最后剩余的一个元素就是要求的结果
public static int calculator(String obj)
{
String postObj=tranform(obj);
System.out.println();
Stack<Integer>stack=new Stack<Integer>();
for(int i=0;i<postObj.length();i++)
{
char ch=postObj.charAt(i);
if(Character.isLetterOrDigit(ch))//字符或者数字
{
stack.push(Integer.parseInt(ch+""));
}
else//操作符
{
//取出两个数
int op1,op2;
op1=stack.pop();
op2=stack.pop();
switch (ch)
{
case '+':
stack.push(op2+op1);
break;
case '-':
stack.push(op2-op1);
break;
case '*':
stack.push(op2*op1);
break;
case '/':
stack.push(op2/op1);
break;
default:
break;
}
}
}
return stack.pop();
}
// 中序遍历改为兴许遍历
public static String tranform(String obj)
{
Stack<Character> stack = new Stack<Character>();
String obj2 = "";
for (int i = 0; i < obj.length(); i++)
{
char ch = obj.charAt(i);
if (Character.isLetterOrDigit(ch))// 字母或数字直接输出
{
obj2 += ch;
System.out.print(ch);
} else if (ch == ')')// 在栈中一致匹配到)操作符才停止出栈
{
char temp;
while ((temp = stack.pop()) != '(')
{
obj2 += temp;
System.out.print(temp);
}
} else
// 比較操作符的进栈优先级
{
if (stack.isEmpty())
{
stack.push(ch);
continue;
}
char temp = stack.peek();
while (icp(ch) <= isp(temp))// 进栈优先级小于栈内优先级,则一直出栈
{
System.out.print(temp);
obj2 += temp;
stack.pop();
if (stack.isEmpty())
break;
temp = stack.peek();
}
stack.push(ch);
}
}
// 将栈中剩余的元素弹出来
while (!stack.isEmpty())
{
char temp = stack.pop();
obj2 += temp;
System.out.print(temp);
}
return obj2;
}
// 操作符在栈内的优先级
private static int isp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 2;
case '*':
case '/':
return 4;
case ')':
return 7;
case '(':
return 1;
default:
break;
}
return 0;
} // 操作符进栈的优先级优先级
private static int icp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 3;
case '*':
case '/':
return 5;
case ')':
return 1;
case '(':
return 7;
default:
break;
}
return 0;
} }

最新文章

  1. c++ 职责链模式(Chain of Responsibility)
  2. FormsAuthentication详解
  3. cojs EX_香蕉 题解报告
  4. Android:ViewPager适配器PagerAdapter的使用
  5. java返回参数中几种常见的方法
  6. esri-leaflet入门教程(4)-加载各类图层
  7. Object-C知识点
  8. OI退役
  9. cd tom-bash: cannot create temp file for here-document: No space left on device
  10. Android Environment 获取各种路径的方法
  11. J01-Java IO流总结一 《异常捕获》
  12. Hibernate Query Language查询:
  13. ios Label TextFile 文本来回滚动 包括好用的三方
  14. ORB-SLAM (四)Initializer单目初始化
  15. 解决Maven报Plugin execution not covered by lifecycle configuration问题
  16. &lt;2013 06 29&gt; In Deutschland. Thinking in Mechanism, EE, CS, etc.
  17. 自以为是而已,不知道它是什么 window.onload 放执行
  18. windows下apache服务器的下载,安装,配置
  19. springboot使用restTemplate post提交值 restTemplate post值
  20. 51 Nod 1244 莫比乌斯函数前n项和

热门文章

  1. POJ2584 T-Shirt Gumbo【二分图多重匹配】
  2. HDU1035深度搜索
  3. Cocos2d-x 地图行走的实现3:A*算法
  4. GitHub上最火的74个Android开源项目
  5. 手机定位原理 - GPS/GLONASS/北斗 + WIFI + 基站(转)
  6. poj3281(最大流)
  7. 使用AndroidFrameworks开发和应用隐藏类 or Android使用自定义framework开发与应用
  8. Java EE (13) -- 常用的基础结构模式
  9. 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错
  10. unity3d教程动态创建简单平面地形