思路如下:

1、初始化两个栈,运算符栈和中间结果栈

2、从左至右扫描

3、遇到数时直接压入s2

4、遇到运算符时,比较其与s1栈顶的优先级,有如下几种情况:

1)s1为空或栈顶为“(”或此运算符优先级大于s1栈顶符优先级时,直接入栈

2)s1栈顶运算符优先级大于等于该运算符时,不断从s1栈中弹出栈顶 并压入s2直到s1为空或优先级大于s1栈顶。然后将此运算符压入s1

5、遇到括号时:

1)为左括号则直接压入s2

2)为右扩号时则不断弹出s1栈顶压入s2直到遇到左括号时,停止弹出并将这一对括号丢弃

6、扫描到最右边时结束循环

7、将s1中的运算符依次弹出并压入s2

8、依次弹出s2中的元素并输出,结果的逆序则为后缀表达式。

主要依赖两个方法,

1、将中缀表达式分割转换为一个list

需要考虑多位数,遍历字符串s,不是数字则直接add入list,是数字则进入while循环直到结束或得到的后一位不为数字了结束拼接,add入list刚刚得到的拼接字符串

public static List<String> tolist(String s){
List<String> list=new ArrayList<String>();
String str="";
char ch=' ';
int i=0;
do {
if((s.charAt(i)<48)||(s.charAt(i)>57)){
list.add(""+s.charAt(i));
i++;
}else {
str="";
while (i<s.length()&&s.charAt(i)>=48&&s.charAt(i)<=57){
str+=s.charAt(i);
i++;
}
list.add(str);
}
}while (i<s.length());
return list;
}

2、将分割后的list转换为后缀表达式

定义两个栈,但由于s2没有pop的操作且之后还要倒序输出所以这里以list来代替栈。遍历list,依据上述描述来写逻辑。

public static List<String> parseList(List<String> list){
Stack<String> stack=new Stack<String>();
List<String> ls=new ArrayList<String>(); for (String item:list){
if(item.matches("\\d+")){
ls.add(item);
}else if (item.equals("(")){
stack.push(item);
}else if (item.equals(")")){
while (stack.size()!=0&&!stack.peek().equals("(")){
ls.add(stack.pop());
}
stack.pop();
}else {
while (stack.size()!=0&&oper.getvalue(stack.peek())>=oper.getvalue(item)){
ls.add(stack.pop());
}
stack.push(item);
} }
while (stack.size()!=0){
ls.add(stack.pop());
}
return ls;
}

最新文章

  1. 初学Scala
  2. [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结
  3. https双向认证demo
  4. linux下shell编程示例-获取进程id
  5. php中mysqli 处理查询结果集的几个方法
  6. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
  7. php文件加锁 lock_sh ,lock_ex
  8. 黑马程序员——HTML语言
  9. mime大全收集
  10. leetcode LRU Cache python
  11. 项目管理工具 Redmine 安装试用手记
  12. 修改非空表字段类型Oracle
  13. wget-文件下载工具
  14. C# 中关于接口实现、显示实现接口以及继承
  15. JSP Debug日志
  16. Typescript学习笔记(五) 模块机制
  17. 必须要学会webpack打包,并到特别精通的程度
  18. git:not a git repository (or any of the parent directories)
  19. Enhancement in SAP abap.
  20. iOS7隐藏状态栏 status Bar

热门文章

  1. 【ccc】为了ds的ccc2
  2. 【RocketMQ】DLedger选主源码分析
  3. 祝 .NET 20周年生日快乐
  4. ECharts 提示框组件Tooltip属性大全(包含文本注释)
  5. StatisticalOutlierRemoval:离群点移除
  6. STM32F0_HAL初始化系列:串口DMA输出
  7. Apache Hudi 流转批 场景实践
  8. Vue3 组件之间的数据传递
  9. 【Vue】Vue开源样式库 Vuex的使用 vuex的执行流程 Vue-router的使用 路由跳转 路由守卫
  10. 如何通过Java 代码设置 Word 文档页边距