`
nkliuliu
  • 浏览: 212715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

逆波兰表达式的面试应用

阅读更多

写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。

 

自己粗写了一个,也算是学习了一下,没有做字符串的初始化和加入全部运算符,但是要用的人改改容易完善

package com.ll.test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.StringTokenizer;
/**
 * 
 * @author LiuLiu
 *
 */
public class CalculateString {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AnalyzingExpression ae = new AnalyzingExpression(
				"4-(4-3*5+(2*4)+100)/10");
		ae.toRight();
		ae.getResult();
	}

}

class AnalyzingExpression {
	private String e = "4-(4-3*5+(2*4)+100)/10";
	private ArrayList<String> ori = new ArrayList<String>();
	private ArrayList<String> right = new ArrayList<String>();
	private String result;

	public ArrayList<String> getRight() {
		return right;
	}

	public AnalyzingExpression(String input) {
		StringTokenizer st = new StringTokenizer(input.replaceAll(" ", ""),
				"+-*/()", true);
		while (st.hasMoreElements()) {
			ori.add(st.nextToken());
		}
	}

	public void toRight() {
		Stack<String> s = new Stack<String>();// 运算符栈
		int position = 0;
		while (true) {
			String currentOriEle = ori.get(position);
			if (Calculate.isOperator(currentOriEle)) {// 如果是运算符需要处理
				if (s.empty() || currentOriEle.equals("(")) {// 如果是空栈,或者是"("直接入栈
					s.push(currentOriEle);
				} else if (currentOriEle.equals(")")) {// 若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
					while (!s.empty()) {
						if (s.peek().equals("(")) {
							s.pop();
							break;
						} else {
							right.add(s.pop());
						}
					}
				} else {// 若为其它,比较stackOperator栈顶元素与当前元素的优先级:如果栈顶元素是'(',当前元素入栈;如果栈顶元素
					// >= 当前元素,出栈并顺序输出运算符直到 栈顶元素 < 当前元素,然后当前元素入栈; 如果 栈顶元素 <
					// 当前元素,直接入栈。
					if (s.peek().equals("(")) {
						s.push(currentOriEle);
					} else {
						while (!s.empty()
								&& Calculate.priority(currentOriEle) <= Calculate
										.priority(s.peek())) {
							right.add(s.pop());
						}
						s.push(currentOriEle);
					}
				}
			} else {// 数字直接进list
				right.add(currentOriEle);
			}
			position++;
			if (position >= ori.size())
				break;
		}
		while (!s.empty()) {// 运算符栈不为空入list
			right.add(s.pop());
		}
	}

	// 对右序表达式进行求值
	public void getResult() {
		Stack<Double> s = new Stack<Double>();
		double n1 = 0;
		double n2 = 0;
		String e = null;
		Iterator<String> it = right.iterator();

		while (it.hasNext()) {
			e = it.next();
			if (Calculate.isOperator(e)) {
				n1 = s.pop();
				n2 = s.pop();
				s.push(Calculate.twoResult(e, n1, n2));
			} else
				s.push(Double.parseDouble(e));
		}
		result = String.valueOf(s.pop());
		it = right.iterator();
		while (it.hasNext()) {
			System.out.print(it.next());
		}
		System.out.println("=" + result);
	}
}

class Calculate {
	public static boolean isOperator(String operator) {
		if ("+-*/()".contains(operator)) {
			return true;
		} else {
			return false;
		}
	}

	public static int priority(String operator) {
		if ("+-".contains(operator))
			return 3;
		else if ("(".contains(operator))
			return 1;
		else if ("*/".contains(operator))
			return 5;
		else
			return 0;
	}

	public static double twoResult(String operator, double y, double x) {
		try {
			double z = 0;
			if (operator.equals("+"))
				z = x + y;
			else if (operator.equals("-"))
				z = x - y;
			else if (operator.equals("*"))
				z = x * y;
			else if (operator.equals("/"))
				z = x / y;
			else
				z = 0;
			return z;
		} catch (NumberFormatException e) {
			throw e;
		}
	}
}

class Stack<T> {
	private LinkedList<T> ll = new LinkedList<T>();

	public void push(T e) {
		ll.addFirst(e);
	}

	public T pop() {
		return ll.removeFirst();
	}

	public T peek() {
		return ll.getFirst();
	}

	public boolean empty() {
		return ll.isEmpty();
	}
}
0
0
分享到:
评论

相关推荐

    java-leetcode面试题解Stack之第150题逆波兰表达式求值-题解.zip

    在准备求职面试时,熟练掌握栈这一数据结构以及逆波兰表达式求值的方法对于Java开发者来说至关重要。这不仅可以帮助你在面试中脱颖而出,而且在实际工作中处理类似问题时也能更加得心应手。通过LeetCode上的练习,你...

    java 逆波兰式(这个是java版的还附有实验报告)

    通过阅读代码,我们可以学习到如何在Java中利用栈数据结构来处理逆波兰表达式。 - **C逆波兰式.txt**:虽然主要讨论的是Java,但这个文件可能提供了C语言实现逆波兰式的代码,可以作为对比和参考,了解不同编程语言...

    js-leetcode题解之150-evaluate-reverse-polish-notation.js

    逆波兰表达式是一种使用后缀表示法的数学表达式,例如,对于常规中缀表达式(3 + 4)* 5,其逆波兰表示形式为[3, 4, +, 5, *]。逆波兰表达式中没有括号,运算符位于相关操作数之后。 逆波兰表达式的计算方法涉及...

    数据结构例程

    在给定的“数据结构例程”压缩包中,包含了多种数据结构及其操作的C++实现,如平衡二叉树、中缀表达式转逆波兰表达式、搜索二叉树、二叉树遍历、链表实现的队列和栈以及数组实现的队列和栈。这些例程有助于理解数据...

    代码9.2blog

    从描述中我们可以看出,这个压缩包涵盖了多个领域的编程挑战,包括但不限于简易火车票售票系统、最佳路径算法、胜负猜想游戏的实现以及逆波兰表达式的解析。这些主题都是计算机科学和软件开发中的常见问题,对于提升...

    几道亚马逊面试题参考答案

    2. ArrayStackOperations.java:这可能是一个与数组栈操作相关的题目,可能涉及到栈的基本操作如push、pop、peek等,也可能涉及到栈的应用,如括号匹配、逆波兰表达式等。 3. BeansMarket.java:此文件名可能暗示了...

    数据结构面试题

    面试题可能包括栈的实现、判断括号匹配、计算逆波兰表达式等。 4. **队列**:队列是一种先进先出(FIFO)的数据结构,常用于任务调度、消息传递等。面试题可能涉及循环队列、优先级队列(堆)等。 5. **哈希表**:...

    奇虎2012笔试面试题

    ### 奇虎2012笔试面试题解析 ...以上是对给定文件中部分笔试面试题目的详细解析,涵盖了字符串操作、逆波兰表达式计算、文件描述符锁、计算机体系结构、进程概念以及Windows环境下的同步机制等内容。

    湖南大学数据结构8个实验完全代码及实验报告(c语言版)

    逆波兰表达式是一种无括号的数学表达式表示法,它使用栈来解决运算顺序。在这个实验中,学生会实现一个基于栈的计算器,处理逆波兰表达式的求值。这涉及到栈的使用,包括压栈、弹栈和栈顶元素的检查。 3. **四则...

    各大公司数据结构面试题集锦

    7. 栈和队列的应用:如括号匹配、逆波兰表达式求值等。 8. 图论问题:最短路径算法(Dijkstra、Floyd-Warshall)、拓扑排序、最小生成树(Prim、Kruskal)等。 9. C++特有:指针操作、内存管理、STL容器的使用、...

    程序员面试的技巧 数据结构

    面试中可能会让你设计一个逆波兰表达式求值器或者实现括号匹配算法。 4. **队列**:队列是先进先出(FIFO)的数据结构,常见应用包括任务调度、缓冲区管理。双端队列(deque)则允许在两端进行入队和出队操作。 5....

    软件研发面试宝典:纸上谈兵

    - C语言基础问题:掌握const的用法、浅复制与深复制的区别、逆波兰表达式、变长参数列表、调用约定、寄存器的使用、内联函数inline、PACK关键字、正则表达式、内存操作方法、四种强制类型转换、sizeof运算符以及...

    数学表达式判断以及计算

    3. **逆波兰表示法(Reverse Polish Notation, RPN)**:也称为后缀表示法,是计算表达式的一种常见方式。在这个表示法中,操作符位于其操作数之后,使得无需括号就能明确表达优先级。通过将表达式转换为RPN,然后...

    算法面试宝典第二版1

    1. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于计算器类问题,如括号匹配、逆波兰表达式求解等。1.1.1章节可能详细讲解了栈的基本概念、操作以及在实际问题中的应用。 1. **队列**:1.2章节可能涉及队列,...

    数据结构相关操作

    在本篇中,我们将深入探讨四个关键的数据结构操作:KMP算法、逆波兰表达式、赫夫曼编码以及迷宫问题的解决方法。 1. KMP算法: KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,主要用于在一个长字符串中查找...

    不粗的面试题

    - C语言基础问题:const关键字的使用、浅复制与深复制、逆波兰表达式、C语言变长参数、调用约定、寄存器、内联函数、PACK、正则表达式、内存操作、类型转换、sizeof、动态库与静态库、压栈优先级、位序、宏、联合体...

    刷题纯享版.zip

    - 栈的应用:括号匹配、逆波兰表达式求解 - 队列的应用:银行排队系统、任务调度 2. **算法** - 覆盖排序、查找、动态规划、贪心、回溯等常见算法。 - 快速排序、归并排序、堆排序 - 二分查找、哈希查找 - ...

    《名企数据结构面试题之--栈与队列(上)》课件和代码

    2. 栈的应用:递归函数的内部实现、后缀表达式(逆波兰表示法)计算、括号匹配等。 3. 队列的基本操作:enqueue、dequeue、队头和队尾检查。 4. 队列的应用:CPU调度、打印机任务管理、广度优先搜索(BFS)算法。 5....

    leetcode 平台题目实现代码

    - 栈和队列的应用,如括号匹配、逆波兰表达式。 - 树形结构的遍历(前序、中序、后序)。 7. **字符串处理**: - KMP算法、Rabin-Karp算法等字符串匹配方法。 - 正则表达式匹配和模式查找。 - 编辑距离算法,...

    RNP Calculator test

    在编程中实现一个RPN计算器,不仅需要掌握栈(Stack)这一数据结构的操作,还需要了解如何将用户输入的字符串进行解析,并将逆波兰表达式转换成可以执行的计算逻辑。 编程实现一个命令行RPN计算器,需要掌握以下几...

Global site tag (gtag.js) - Google Analytics