《算法4》——补全左括号的问题
来源:互联网 发布:销售月数据分析表格 编辑:程序博客网 时间:2024/04/28 23:14
题目
在完成《算法》课后题目的过程中,遇到一道题目内容如下:
编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )你的程序应该输出:((1 + 2) * ((3 - 4) * (5 - 6)))
思路
开始感觉这个题目就有点类似求四则表达式的题目,也就是所谓的双栈法。
双栈法的原理如下:
1. 构造两个Stack,分别用来存储操作符(optrStack)和操作数(dataStack).2. 遍历表达式,如果是操作数,则入操作数栈;如果是运算符,则比较当前运算符和optrStack栈顶运算符的优先级:当优先级大于栈顶运算符时,则操作符入栈。当优先级小于栈顶运算符时,则运算符出栈,同时dataStack出栈两个操作数,计算结果后再将操作数入栈。3. 重复2,直到optrStack为空为止。
这个题目我们可以参考双栈法实现:
- 我们构造两个Stack,操作符栈(optrStack)和操作数栈(dataStack)。
- 遍历表达式,如果不是右括号,判断是否为操作符,是则入optrStack,不是则入dataStack;如果是右括号,则将optrStack和dataStack分别出栈,并且构造出“(” + d1 + opt + d2 + “)”的表达式后,再将其入dataStack即可。
参考代码
import java.util.Stack;/** * Created by wzy on 16-1-17. */public class CompleteParentese { private String completeParentese(String str) { Stack<String> optrStack = new Stack<>(); Stack<String> dataStack = new Stack<>(); for (int i = 0; i < str.length(); i++) { if (isDigit(str.charAt(i))) { // 处理数字的情况 dataStack.push(String.valueOf(str.charAt(i))); } else if (isOpeartor(str.charAt(i))) { // 处理操作符的情况 optrStack.push(String.valueOf(str.charAt(i))); } else { // 处理右括号的情况 String d2 = dataStack.pop(); String d1 = dataStack.pop(); String opt = optrStack.pop(); String exstr = "(" + d1 + opt + d2 + ")"; dataStack.push(exstr); } } while (optrStack.size() > 0) { String opt = optrStack.pop(); String d2 = dataStack.pop(); String d1 = dataStack.pop(); String exstr = "(" + d1 + opt + d2 + ")"; dataStack.push(exstr); } return dataStack.pop(); } private boolean isOpeartor(char ch) { return ch == '+' || ch == '-' || ch == '*' || ch == '/'; } private boolean isDigit(char ch) { return ch >= '0' && ch <= '9'; } public static void main(String[] args) { String str = "1+2)*3-4)*5-6)))"; CompleteParentese cp = new CompleteParentese(); String res = cp.completeParentese(str); System.out.println(res); }}
上述代码没有考虑带空格等特殊字符的情况,大家可以自行增加相关代码。
0 0
- 《算法4》——补全左括号的问题
- 算法——括号匹配问题(堆栈应用)
- Java算法-括号问题
- ACM—括号配对问题
- 匹配括号的算法
- 【算法编程】括号表达式问题
- 括号匹配问题——stack的利用
- 括号的匹配问题
- 括号的匹配问题
- NYOJ2——括号匹配问题
- C++刷题——括号配对问题
- JZOJ 2113——括号问题
- 宏定义表达式—完备括号问题
- 简单的括号匹配算法
- 小括号的匹配算法
- 递归的使用——关于括号排列(分别使用Java和C++算法实现)
- 数据结构与算法学习之路:检查表达式的括号是否匹配——栈
- 大括号的匹配问题
- x64 linux 下C语言、AT&T格式…
- Ubuntu环境下FLTK开发OpenGL程序
- Ubuntu环境下FLTK开发OpenGL程序
- 修改当前目录下文件的后缀(如.c文…
- ubuntu下安装宋体simsun
- 《算法4》——补全左括号的问题
- 将当前目录的各子目录下的文件名前…
- 文件编码转换
- UNetbootin for Linux制…
- MapReduce教程(一)基于MapReduce框架开发
- 为PHP添加mbstring扩展库
- php中使用IBM-DB2
- 64位ubuntu安装wps
- Ubuntu下VirtualBox的安装