`
jocks
  • 浏览: 6446 次
文章分类
社区版块
存档分类
最新评论

java利用栈实现四则运算

阅读更多

1,代码第一部,处理输入的计算式

2,代码第二部分,中缀表达式转化为后缀表达式

3,代码第三部分,计算后缀表达式,并返回运算结果

有两个类,一个是主要的实现类LT.java 另一个是测试类Test.java


1,LT.java

package cal;
import java.util.*;
public class LT {

	public char[] op = {'+','-','*','/','(',')'};
	public String[] strOp = {"+","-","*","/","(",")"};
	public boolean isDigit(char c){
		if(c>='0'&&c<='9'){
			return true;
		}
		return false;
	}
	public boolean isOp(char c){
		for(int i=0;i<op.length;i++){
			if(op[i]==c){
				return true;
			}
		}
		return false;
	}
	public boolean isOp(String s){
		for(int i=0;i<strOp.length;i++){
			if(strOp[i].equals(s)){
				return true;
			}
		}
		return false;
	}
	/**
	 * 处理输入的计算式
	 * @param str
	 * @return
	 */
	public List<String> work(String str){
		List<String> list = new ArrayList<String>();
		char c;
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<str.length();i++){
			c = str.charAt(i);
			if(isDigit(c)){
				sb.append(c);
				
			}
			if(isOp(c)){
				if(sb.toString().length()>0){
					list.add(sb.toString());
					sb.delete(0, sb.toString().length());
				}
				list.add(c+"");
			}
		}
		if(sb.toString().length()>0){
			list.add(sb.toString());
			sb.delete(0, sb.toString().length());
		}
		return list;
	}
	public void printList(List<String> list){
		for(String o:list){
			System.out.print(o+" ");
		}
	}
	/**
	 * 中缀表达式转化为后缀表达式
	 * 1,遇到数字输出
	 * 2,遇到高优先级的全部出栈
	 * 3,最后全部出栈
	 */
	public List<String> InfixToPostfix(List<String> list){
		List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式
		Stack<String> stack = new Stack<String>();//暂存操作符
		//stack.push('#');
		for(int i=0;i<list.size();i++){
			
			String s = list.get(i);
			if(s.equals("(")){
				stack.push(s);
			}else if(s.equals("*")||s.equals("/")){
				stack.push(s);
			}else if(s.equals("+")||s.equals("-")){
				if(!stack.empty()){
					while(!(stack.peek().equals("("))){
						Postfixlist.add(stack.pop());
						if(stack.empty()){
							break;
						}
					}
					stack.push(s);
				}else{
					stack.push(s);
				}
			}else if(s.equals(")")){
				while(!(stack.peek().equals("("))){
					Postfixlist.add(stack.pop());
				}
				stack.pop();
			}else{
				Postfixlist.add(s);
			}
			if(i==list.size()-1){
				while(!stack.empty()){
					Postfixlist.add(stack.pop());
				}
			}
		}
		return Postfixlist;
	}
	/**
	 * 后缀表达式计算
	 */
	public int doCal(List<String> list){
		Stack<Integer> stack = new Stack<Integer>();
		for(int i=0;i<list.size();i++){
			String s = list.get(i);
			int t=0;
			if(!isOp(s)){
			    t = Integer.parseInt(s);
				stack.push(t);
			}else{
				if(s.equals("+")){
					int a1 = stack.pop();
					int a2 = stack.pop();
					int v = a2+a1;
					stack.push(v);
				}else if(s.equals("-")){
					int a1 = stack.pop();
					int a2 = stack.pop();
					int v = a2-a1;
					stack.push(v);
				}else if(s.equals("*")){
					int a1 = stack.pop();
					int a2 = stack.pop();
					int v = a2*a1;
					stack.push(v);
				}else if(s.equals("/")){
					int a1 = stack.pop();
					int a2 = stack.pop();
					int v = a2/a1;
					stack.push(v);
				}
			}
		}
		return stack.pop();
	}
}

2,测试类Test.java

package cal;

import java.util.*;

public class Test {

	public static void main(String[] args) {
		LT lt = new LT();
		String str = "9+(3-1)*3+10/2";
		List<String> list = lt.work(str);
		List<String> list2 = lt.InfixToPostfix(list);
		System.out.println("原式为:"+str);
		System.out.print("后缀表达式为:");
		lt.printList(list2);
		System.out.println(" ");
		System.out.println("计算结果为:"+lt.doCal(list2));
		
		
		
	}

}


3,输出结果

原式为:9+(3-1)*3+10/2
后缀表达式为:9 3 1 - 3 * + 10 2 / +
计算结果为:20


分享到:
评论

相关推荐

    java简易计算器(四则运算、三角函数、实现优先级)

    java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识

    java实现四则运算

    java实现四则运算,将中缀表达式变成后缀表达式,使用栈来做最后的运算

    j# java计算器 四则运算 栈

    是一款j#版的计算器,稍改动以下能用在java上应用,拥有计算器的基本功能,四则运算是用栈实现的,每一步运行显示都和买的计算器一样——————申明菜鸟版!!

    Java利用堆栈实现简单四则运算

    NULL 博文链接:https://chinamobile.iteye.com/blog/1630919

    java编写一个类,该类可以进行加、减、乘、除四则运算,并且输出运算结果

    (1)编写一个类,该类可以进行加、减、乘、除四则运算,并且可以输出运算结果。此外,对于除法,如果被除数为0,该类可以报错。对于加、减、乘、除之外的运算符,该类应该告知无法处理。 (2)编写一个包含主方法...

    利用堆栈编程实现四则混合运算

    利用堆栈编程实现四则混合运算,说得很详细,短小,挺容易理解的~

    算术四则运算

    一个利用栈实现四则运算的小资源,操作数只能是个位数

    利用值栈求表达式 java

    实现简单的四则运算 支持带括号的 运算!

    java基础入门教程

    四 、 Java 语 言 的 应 用 前 景 Java 语 言 有 着 广 泛 的 应 用 前 景 ,大 体 上 可 以 从 以 下 几 个方面 来 考 虑 其 应 用 : 1 所 有 面 向 对 象 的 应 用 开 发 ,包 括 面 向 对 象 的 事 件 描 述、...

    JAVA面试题最全集

    请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46....

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    基于Java的Android应用程序开发-24点游戏源码+详细项目说明.zip

    重复上述步骤,直到列表中只剩下1个数字,这个数字就是一种可能性的结果,如果结果等于24,则说明可以通过运算得到24。如果所有的可能性的结果都不等于24,则说明无法通过运算得到24。 除法运算为实数除法,因此...

    Java实验报告(5).doc

    四、实验结果与数据处理 程序代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class experiment_3{ static int intInputValue; static String ...

    Java经典入门教程pdf完整版

    JE( ava Enterprise edition)是·种利用Java平台来简化企业解决方案的开发、部 著和管理相关的复杂问题的体系结构。JE技术的基础就是核心Java平台或Java平台的标 准版,JEE不仅巩固了标淮版屮的诈多优点,例如“编写一...

    数据结构面试题 java面试题

    8.在单链表中,增加头结点的目的是(方便运算的实现) 9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 10.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D) A.每个元素都有一个直接...

    javaSE代码实例

    14.8 栈在Java中的实现 309 14.8.1 Stack类的使用 309 14.8.2 Deque接口的使用 310 14.8.3 利用栈计算数学表达式 311 14.9 集合元素的常用操作 314 14.9.1 元素排序 315 14.9.2 搜索特定元素 316 ...

    算法导论(part1)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    算法导论(part2)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

Global site tag (gtag.js) - Google Analytics