`
baby69yy2000
  • 浏览: 187883 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

Stack练习:: 中缀-后缀表达式

    博客分类:
  • Util
阅读更多
package Stack.Calculate;

import java.util.List;

public class calculation {
	private String expression = null;

	private InfixToPostfix inf = null;

	private PostfixEval pos = null;

	public calculation(String s) {
		expression = s;
		expression += "@";
	}

	public int calculat() {
		int result = 0;
		// 转化成后缀表达式
		inf = new InfixToPostfix(expression);
		List<String> list = inf.toPostfix();

		// 后缀表达式求值
		pos = new PostfixEval(list);
		result = pos.evaluate();
		return result;
	}

	public static void main(String[] args) {
		calculation c = new calculation("(300 + 200) / 100");
		System.out.println(c.calculat()); // 5
	}

}


中缀转化成后缀表达式
package Stack.Calculate;

import java.util.*;

public class InfixToPostfix {

	private String infixExp = null;

	private List<String> postfixExp = new ArrayList<String>();

	private Stack<Character> operStack = new Stack<Character>();

	private StringBuffer numBuf = new StringBuffer();

	private int priority(char op) {
		switch (op) {
		case '+':
		case '-':
			return 1;
		case '*':
		case '/':
			return 2;
		case '(':
		case '@':
			return 0;
		}
		return -1;
	}

	public InfixToPostfix(String s) {
		infixExp = s;
	}

	public List<String> toPostfix() {
		char ch, preChar;
		operStack.push('@');

		for (int i = 0; i < infixExp.length();) {
			ch = infixExp.charAt(i);
			switch (ch) {
			case '+':
			case '-':
			case '*':
			case '/':
				preChar = operStack.peek();
				while (priority(preChar) >= priority(ch)) {
					postfixExp.add("" + preChar);
					operStack.pop();
					preChar = operStack.peek();
				}
				operStack.push(ch);
				i++;
				break;
			case '(':
				operStack.push(ch);
				i++;
				break;
			case ')':
				char c = operStack.pop();
				while (c != '(') {
					postfixExp.add("" + c);
					c = operStack.pop();
				}
				i++;
				break;
			case '@':
				char c1;
				while (!operStack.isEmpty()) {
					c1 = operStack.pop();
					if (c1 != '@')
						postfixExp.add("" + c1);
				}
				i++;
				break;
			case ' ':
			case '\t':
				i++;
				break;
			default:
				if (Character.isDigit(ch)) {
					while (Character.isDigit(ch)) {
						numBuf.append(ch);
						ch = infixExp.charAt(++i);
					}
					postfixExp.add("" + numBuf);
					numBuf = new StringBuffer();
				} else {
					System.err.println("Illegal operator");
				}

			} // switch end~
		}

		return postfixExp;
	} // toPostfix end~

	/*
	 * public static void main(String[] args) { InfixToPostfix in = new
	 * InfixToPostfix("50 + 2 * 3@"); List<String> list = in.toPostfix();
	 * System.out.println(list); }
	 */

}


后缀表达式求值
package Stack.Calculate;

import java.util.*;

public class PostfixEval {
	private Stack<String> operandStack;

	private List<String> list;

	private boolean isOperator(String s) {
		return s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/");
	}

	private int getOperand() {
		/*
		 * if (operandStack.isEmpty()) throw new
		 * ArithmeticException("PostfixEval: Too many operators");
		 */

		return Integer.parseInt(operandStack.pop());
	}

	private int compute(int left, int right, String item) {
		if (item.equals("+"))
			return left + right;
		else if (item.equals("-"))
			return left - right;
		else if (item.equals("*"))
			return left * right;
		else {
			if (right == 0)
				throw new ArithmeticException("PostfixEval: divide by 0");
			return left / right;
		}
	}

	public PostfixEval(List<String> list) {
		this.list = list;
		this.operandStack = new Stack<String>();
	}

	public int evaluate() {
		int left, right, expValue = 0;
		String item;
		for (int i = 0; i < list.size(); i++) {
			item = list.get(i);
			if (isOperator(item)) {
				right = getOperand();
				left = getOperand();
				expValue = compute(left, right, item);
				operandStack.push("" + new Integer(expValue));
			} else {
				operandStack.push(item);
			}
		}

		/*
		 * if (!operandStack.isEmpty()) throw new
		 * ArithmeticException("PostfixEval: Too many operands");
		 */
		return Integer.parseInt(operandStack.pop());
	}

}
分享到:
评论

相关推荐

    Stack练习 中缀-后缀表达式 -

    在这个Java Stack练习中,我们将探讨如何将中缀表达式转换为后缀表达式,并利用栈的数据结构来简化计算。 首先,我们要了解栈这种数据结构。栈是一种具有“后进先出”(LIFO,Last In First Out)特性的数据结构,...

    栈的应用-中缀-后缀_particularlyu77_栈的应用-中缀-后缀_

    本主题“栈的应用-中缀-后缀”着重讲解如何利用栈来处理中缀表达式和后缀表达式的转换,这对于理解和实现计算算法至关重要。中缀表达式是我们日常生活中常见的数学公式形式,例如 \(2 + 3 * 4\),而后缀表达式,又称...

    java堆栈的应用--中缀表达式转换成后缀表达式和计算

    在本项目中,“java堆栈的应用--中缀表达式转换成后缀表达式和计算”具体涉及到了两个主要知识点:中缀表达式的转换与后缀表达式的计算。 1. **中缀表达式**:这是我们常见的数学表达式形式,如 `2 + 3 * 4`,其中...

    中缀表达式-后缀表达式

    ### 中缀表达式转换为后缀表达式的详细解析 在计算机科学中,表达式的表示方式主要有三种:前缀、中缀和后缀。其中,中缀表达式是我们日常生活中最常用的数学表达式形式,如“3 + 4”。而后缀表达式(也称逆波兰...

    自定义栈中缀表达式转换为后缀表达式并求值

    此案例主要涉及到了三种自定义类的设计:`stack`用于管理运算符的顺序和优先级,`Middle_expressionToPost_expression`负责中缀表达式到后缀表达式的转换,而`Post_expression_value`则用于解析后缀表达式并计算其...

    用二叉树实现中缀表达式转换成后缀表达式

    C++实现中,你可以使用`std::stack`容器来模拟栈,`std::string`来存储后缀表达式,同时使用`std::stringstream`来处理中缀表达式中的操作数和运算符。以下是一个简单的C++代码框架: ```cpp #include #include ...

    算术表达式中缀转后缀并计算结果

    通过编写程序,你可以输入一个中缀表达式,程序会将其转化为后缀表达式,并计算出最终结果。这不仅锻炼了你对算法的理解,还提高了处理实际问题的能力。 为了完成这个任务,你需要掌握以下几个关键点: - 栈数据...

    中缀表达式转后缀表达式

    本文将详细介绍如何将中缀表达式转换为后缀表达式,以及如何使用C++和栈数据结构实现这一过程。 首先,我们需要理解栈的基本概念。栈是一种线性数据结构,遵循“后进先出”(LIFO)原则。在处理中缀表达式时,栈...

    用堆栈实现中缀转后缀表达式计算课程设计

    在本文中,我们将讨论如何使用堆栈来实现中缀表达式到后缀表达式的转换,并计算后缀表达式的结果。这个过程通常应用于计算机科学中的表达式计算,特别是编程语言的解析和计算。 首先,我们要理解中缀表达式和后缀...

    中缀表达式转换成后缀表达式

    这里我们关注的是将中缀表达式转换为后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN)。中缀表达式是我们通常使用的数学表达式形式,其中操作符位于操作数之间,例如 "2 + 3"。而后缀表达式则是操作...

    数据结构的中缀表达式转后缀表达式使用C++实现

    本文将详细讨论如何使用C++实现数据结构中的一个重要概念——中缀表达式转化为后缀表达式,也被称为逆波兰表示法。这个过程涉及到堆栈这一重要的数据结构。 中缀表达式是我们日常生活中常见的数学表达式形式,例如 ...

    c语言实现中缀表达式向后缀表达式转换

    ### C语言实现中缀表达式向后缀表达式转换 #### 概述 在计算机科学领域,表达式的处理是一项基础而重要的任务。表达式通常有三种形式:前缀(波兰)、中缀(标准数学表达式)和后缀(逆波兰)。本篇文章将详细探讨...

    基于栈实现的中缀表达式转换为后缀表达式

    这里我们关注的是将中缀表达式转换为后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN)。这个过程是通过使用数据结构栈来完成的,对于理解和编写计算表达式的程序至关重要。下面我们将详细探讨这一...

    【1分】表达式中缀转后缀C++代码

    #### 一、中缀表达式与后缀表达式简介 在计算机科学领域中,表达式的表示方式主要有三种:中缀表达式、前缀表达式和后缀表达式。 - **中缀表达式**:我们通常使用的数学表达式形式,如 `3 + 4`。 - **前缀表达式**...

    数据结构(中缀表达式转后缀表达式)

    /*程序由本人编译,并且经过多次测试,正确无误!目前该转换算法只支持数字在0至9之间的+-*/四元运算转换.*/ /**************程序员信息 ***************东北大学*******************东大很厉害**************** ...

    中缀转后缀并计算结果

    在编程领域,中缀表达式、后缀表达式(也称为逆波兰表示法)和计算表达式是重要的概念,尤其在解析和计算数学表达式时。中缀表达式是我们日常生活中常用的运算符位于操作数之间的表达式形式,如 `2 + 3 * 4`。后缀...

    中缀表达式变后缀表达式的求值

    后缀表达式将操作符放在它们的操作数之后,例如,上述中缀表达式在后缀表示法中为 \(2 3 4 \times +\)。 中缀表达式转后缀表达式的算法通常包含两个主要步骤:扫描和输出。首先,我们需要扫描整个中缀表达式,遇到...

    栈的应用——表达式求解,中缀表达式转换成后缀表达式

    本主题主要关注栈在表达式求解中的应用,特别是如何将中缀表达式转换为后缀表达式,并通过这种方式求解表达式的值。 中缀表达式是我们日常生活中常见的数学表达式形式,例如 \(2 + 3 * 4\),运算符位于操作数之间。...

    栈和队列的应用实验 利用栈实现中缀表达式与前缀表达式的转换

    后缀表达式 (Postfix Notation),比如前所述的中缀表达式转换为后缀表达式为:"A B C * - D +"。 四、实例 中缀:a+b*c-(d+e) 后缀:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 前缀:-( +(a *(bc)) +(de)) 把...

Global site tag (gtag.js) - Google Analytics