栈(经典应用逆波兰表达式)
来源:互联网 发布:mac版剪辑视频软件 编辑:程序博客网 时间:2024/05/21 12:14
java中栈继承了Vector,源码很简单,采用的是顺序存储结构。
实现栈:
import java.util.Arrays;public class Stack { private Object[] elementData; private int size; public Stack() { this(10); } public Stack(int initialCapacity) { this.elementData = new Object[initialCapacity]; } public int size() { return this.size; } public Object push(Object obj) { // 检查表空间是否以满 check(size + 1); elementData[size++] = obj; return obj; } private void check(int minCapacity) { if (minCapacity - elementData.length < 0) { int oldCapactity = elementData.length; int newCapacity = oldCapactity << 1; elementData = Arrays.copyOf(elementData, newCapacity); } } public Object pop() { final Object last; last = elementData[size - 1]; elementData[size - 1] = null; size--; return last; } public static void main(String[] args) { Stack s = new Stack(); }}
逆波兰表达式:
package demo;import java.util.Scanner;import java.util.Stack;public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); char[] data = input.toCharArray(); StringBuilder sb = new StringBuilder(); Stack<Character> ops = new Stack<>(); Stack<Double> vals = new Stack<>(); toPostfix(data, sb, ops); scanner.close(); // 9+(3-1)*3+8/2 calculate(sb, vals); System.out.println(sb.toString()); System.out.println("----"); System.out.println(vals.pop()); } /** * @param sb * @param vals * 存后缀表达式的栈 */ public static void calculate(StringBuilder sb, Stack<Double> vals) { for (int i = 0; i < sb.length(); i++) { Character c = sb.charAt(i); System.out.println(c); // 将数字压入栈 if (getPriority(c) == 0) { vals.push(Double.valueOf(c.toString())); } else { // 弹出栈顶的元素,计算压入栈 Double top = vals.pop(); Double second = vals.pop(); double result = 0; if (c.equals('-')) result = second - top; if (c.equals('+')) result = second + top; if (c.equals('*')) result = second * top; if (c.equals('/')) result = second / top; vals.push(result); } } } /** * @param data * 输入的数据 * @param sb * 保存后缀表达式 * @param ops * 存运算符的栈 */ public static void toPostfix(char[] data, StringBuilder sb, Stack<Character> ops) { int priority = 0;// 标记栈顶元素的优先级 for (int i = 0; i < data.length; i++) { Character c = data[i]; System.out.println(c); // 遇到右括号弹出栈顶运算符 if (c.equals(')')) { Character popData = ops.pop(); sb.append(popData); } // 如果是运算符 if (getPriority(c) != 0) { // 比较栈顶运算符优先级,大于等于压入栈,否则弹出全部 if (getPriority(c) >= priority) { ops.push(c); priority = getPriority(c); } else { while (!ops.isEmpty()) { Character popData = ops.pop(); sb.append(popData); } // 将当前运算符压入栈 ops.push(c); } } else if (!c.equals('(') && !c.equals(')')) { sb.append(c + ' '); } } // 将栈内所有剩余的运算符弹出 while (!ops.isEmpty()) { sb.append(ops.pop()); } } /** * @param c * @return 返回运算符的优先级 */ private static int getPriority(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } }}
只能输入数字1-9,双位数判断没有想通请大神指教
阅读全文
0 0
- 栈(经典应用逆波兰表达式)
- 栈的应用(括号匹配、逆波兰表达式)
- 数据结构 栈的应用 逆波兰表达式
- 栈的应用:逆波兰表达式
- 栈的应用—逆波兰表达式
- 栈的应用:逆波兰表达式求值
- 栈的应用--逆波兰表达式
- 波兰表达式和逆波兰表达式(栈)
- 栈应用之逆波兰表达式与表达式求值
- android 逆波兰表达式的应用(一)逆波兰表达式简介 -----小达
- android 逆波兰表达式的应用(二)逆波兰表达式的计算 -----小达
- android逆波兰表达式的应用(四)逆波兰表达式的计算实现 -----小达
- 栈 逆波兰表达式
- 栈的应用二--四则运算表达式求值(逆波兰表示:后缀表达式)
- 波兰、逆波兰表达式
- 【数据结构】栈的应用—逆波兰表达式
- (12)逆波兰表达式(递归的应用)
- 栈及栈的应用(括号匹配和逆波兰表达式)
- Rescue HDU-1242
- Python中的random模块
- Http协议相关内容
- FTP Client enterLocalPassiveMode
- linux命令
- 栈(经典应用逆波兰表达式)
- JDK环境变量配置说明
- Dubbo系列(五)Dubbo之监控中心Monitor
- ubuntu14.04 qt 编译程序报错cannot find -lGL
- 阿里云服务器如何设置IPV6通过appstore的审核
- javaWeb https连接器
- JAVA学习路线图
- UE4 局域网斗地主(一)
- Git常用命令(创建分支-关联分支-提交-合并等操作)