`
QuarterLifeForJava
  • 浏览: 177810 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

四则运算的简单模拟(栈的运用)

阅读更多

说明:程序只是为了说明计算规则(思路),并未优化,可能还是存在一些BUG(未进行大量数据的反复验证),必有更好的实现方式!!!
另外,在计算过程中,由于采用int,因此对于如5/3*3并不是5,而是3,所以可能计算结果有点出入!!!


栈:先进后出
四则运算的运用:
①将中缀表达式转为后缀表达式
规则1:若出现的符号等级低于栈顶的表达式等级(如符号为'+或-',而栈顶为'*或/',则除顶部自己外其余全部出栈;若碰到同级则只出栈一个(如符号为'+',而栈顶为'-'且栈中还有'+-',则只出栈顶一个'-')
规则2:若出现左右括号,则括号内的内容全部出栈
规则3:非符号(即数字)不用进栈,只需依次记录即可
②入栈计算后缀表达式并得出结果
规则:类似"56*"则计算为5*6=30,然后30入栈继续计算

附上代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Test {

	public static void main(String[] args) {
		//Test1
		String str1[] = {"9","+","(","3","-","1",")","*","3","+","10","/","2"};
		System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str1)));
		//Test2
		String str2[] = {"3","+","6"};
		System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str2)));
		//Test3
		String str3[] = {"13","-","6","/","2","-","1","+","3","*","5","/","3"};
		System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str3)));
		//Test4
		String str4[] = {"4","/","2","+","1","-","5","+","3","*","6","/","2"};
		System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str4)));
	}
	
	//将中缀表达式转为后缀表达式
	public static List<String> infixExpression2PostfixExpression(String str[]){
		List<String> sb = new ArrayList<String>();
		Stack<String> s = new Stack<String>();
		for(int i=0;i<str.length;i++){
			if(str[i].equals("+")||
			   str[i].equals("-")||		
			   str[i].equals("*")||		
			   str[i].equals("/")||		
			   str[i].equals("(")||
			   str[i].equals(")")
			){
				if(s.contains("(")&&str[i].equals(")")){
					s.push(str[i]);
					Stack<String> ss = new Stack<String>();
					ss.addAll(s);
					int count = ss.size();
					int removeCount = 0;
					for(int m=0;m<count;m++){
						String pop = ss.pop();
						if((!(pop.equals("(")))&&
						   (!(pop.equals(")")))){
							sb.add(pop);
							removeCount++;
						}else if(pop.equals("(")){
							break;
						}
					}
					//+2表示算上左右括号
					for(int n=1;n<=(removeCount+2);n++){
						s.pop();
					}
				}else if((str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
						 (str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
						 (str[i].equals("*")&&((s.isEmpty()?"":s.lastElement()).equals("/")))||
						 (str[i].equals("/")&&((s.isEmpty()?"":s.lastElement()).equals("*")))||
						 (str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("-")))||                                                                    
						 (str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("+")))){
					if((str[i].equals("+")&&(s.lastElement().equals("*")||s.lastElement().equals("/")))||
					   (str[i].equals("-")&&(s.lastElement().equals("*")||s.lastElement().equals("/")))	){
						s.push(str[i]);
						String sss = "";
						int length = s.size();
						for(int k=0;k<length;k++){
							if(k==0){
								sss = s.pop();
							}else{
								sb.add(s.pop());
							}
						}
						s.push(sss);
					}else{
						sb.add(s.pop());
						s.push(str[i]);
					}
				}else{
					s.push(str[i]);
				}
			}else{
				sb.add(str[i]);
			}
		}
		//最后还有剩余则出栈
		int restLength = s.size();
		for(int o=0;o<restLength;o++){
			sb.add(s.pop());
		}
		return sb;
	}

	//将后缀表达式入栈计算并得出最终结果
	public static String calculateInfixExpression(List<String> list){
		System.out.println(list);
		Stack<String> s = new Stack<String>();
		for(int i=0;i<list.size();i++){
			String data = list.get(i);
			if(data.equals("+")||data.equals("-")||data.equals("*")||data.equals("/")){
				int firstPop = Integer.parseInt(s.pop());
				int secondtPop = Integer.parseInt(s.pop());
				int result = 0;
				switch(data){
					case "+":
						result = secondtPop+firstPop;
						break;
					case "-":
						result = secondtPop-firstPop;
						break;
					case "*":
						result = secondtPop*firstPop;
						break;
					case "/":
						result = secondtPop/firstPop;
						break;
				}
				s.push(String.valueOf(result));
			}else{
				s.push(data);
			}
		}
		//最后应该总是还剩一个
		return s.pop();
	}

}
3
2
分享到:
评论
1 楼 comsci 2014-07-21  
高手啊....经典

相关推荐

    栈实现四则运算

    在编程领域,四则运算的实现...通过这个过程,不仅可以学习到栈和队列的运用,还能加深对四则运算规则的理解。在压缩包中的`StackCalc`文件应该包含了完整的源代码实现,读者可以参考并实践,以更深入地掌握这个算法。

    PB做的计算器(支持多则运算)

    总结来说,"PB做的计算器(支持多则运算)"这个项目涵盖了PowerBuilder的基础使用、事件驱动编程、用户界面设计、数学运算逻辑实现、键盘事件处理、以及数据窗口的运用等多个方面的知识点。通过这样一个项目,开发者...

    c语言简易计算器实现中缀表达式四则混合运算

    在C语言编程中,实现一个简易的计算器,特别是处理中缀表达式的四则混合运算,是一项常见的练习。这个任务涉及到字符串处理、字符解析、栈数据结构的运用以及运算符优先级的理解。以下将详细讲解这一过程中的关键...

    模拟计算器课程设计报告

    - 支持基本的四则运算及括号运算。 - 表达式合法性检查:判断输入的字符是否符合数学表达式规则。 - 错误处理:如果输入的表达式非法,程序能够识别并给出相应提示。 - 清除与全清除功能:清除最近输入的数字或...

    算法竞赛入门经典课后题答案

    8. **模拟与暴力枚举**:对于一些简单的或特定的题目,直接模拟过程或者暴力遍历所有可能的解可能是最直观的方法,但需要注意时间和空间复杂性的控制。 9. **位操作**:在解决一些与整数操作相关的问题时,位操作...

    设计一个程序来模拟一个简单的手持计算器

    - **四则运算**:程序需要实现加法(+)、减法(-)、乘法(*)和除法(/)操作。这些可以通过重载运算符函数或者单独的方法来完成。 - **优先级**:确保运算符的优先级得到正确处理,例如乘法和除法先于加法和...

    仿windoes计算器

    这可能涉及到栈数据结构的运用,因为计算四则混合表达式通常采用逆波兰表示法(RPN)或中缀表达式的转换。 4. **错误处理**:计算器应该能处理各种异常情况,比如除以零、输入非法字符等。良好的错误处理机制可以...

    用栈和数结构算法实现的计算器等程序设计示例

    3. 计算器:实现一个十进制四则运算计算器需要理解操作数和运算符的优先级。可以使用两个栈,一个存储数字,另一个存储运算符。遍历输入的表达式,遇到数字时压入数字栈,遇到运算符时,根据运算符的优先级与栈顶...

    数据结构课程设计:手机通通讯录模拟,24点扑克牌游戏)

    本项目选择了两个经典实例:手机通讯录模拟和24点扑克牌游戏,这两个主题都是很好的数据结构应用场景,能充分展示链表、树、排序等基本数据结构的运用。 首先,让我们关注手机通讯录模拟。通讯录是一个存储联系人...

    数据结构实验课 (2).pdf

    1. 算术表达式求值:利用后缀表达式(逆波兰表示法)和栈,实现四则运算。栈用于存储操作数和运算符,根据运算符优先级进行计算。 2. 运动员混合双打组合:使用队列模拟运动员的配对过程,每次从队首取出一对进行...

    程序设计综合实践课C简单计算器.pptx

    本项目旨在帮助学生掌握基础的编程概念,特别是涉及四则运算和数据结构的运用。我们将讨论以下几个方面: 1. **项目概述** - 目标是构建一个名为myCalculator的计算器程序,它能处理连续的数学运算,如4+5+6或5*8+...

    Delphi 表达式计算控件formula最新版,支持很多数学函数

    它可以支持基本的四则运算(加、减、乘、除),同时涵盖了更高级的数学函数,例如指数、对数、三角函数(正弦、余弦、正切)、反三角函数、平方根、立方根等。此外,它还可能支持复数运算、矩阵计算以及统计和概率...

    2012年考研值得做的计算机模拟题

    1. **数据结构**:理解并能灵活运用链表、树、图、堆、栈、队列等基本数据结构,以及排序和搜索算法,如冒泡排序、快速排序、二分查找等。 2. **算法**:深入学习贪心、动态规划、回溯、分治等算法思想,并能解决...

    成都理工大学真题+模拟题.rar

    1. **极限与连续**:理解函数的极限概念,掌握极限的四则运算规则,能求解多元函数的极限,理解函数的连续性及其性质。 2. **导数与微分**:掌握导数的几何意义和物理意义,会求函数的一阶、二阶导数,利用导数判断...

    数据结构速算24源程序

    该程序是设计用来实现“速算24”的...总的来说,这个程序巧妙地运用了栈这一数据结构来解决速算24游戏的计算问题,通过中缀转后缀和栈的运算,使得计算过程变得简单且高效。此外,它还结合了图形界面,增强了用户体验。

    数据结构课程设计

    设计一个算术表达式求解器,需要解析输入的字符序列,处理四则运算。这通常使用栈来实现,遇到运算符时进行相应的计算,遇到数字则压入栈中,最后得到结果。 交通咨询模拟问题利用有向图表示城市的交通网络,寻找从...

    24点算法及算术运算算法

    这个游戏的规则简单而富有深意:玩家需从四张1到13的扑克牌中,通过加减乘除、括号等基本算术运算,使得结果恰好等于24。今天我们将深入探讨24点算法以及其中涉及到的算术运算算法。 首先,24点算法的核心在于如何...

    数据结构课程设计 四题

     以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后...

    用c#写的一个简单的计算器

    在本文中,我们将深入探讨如何使用C#编程语言构建一个功能丰富的计算器,涵盖四则运算、符号处理、平方根、指数运算、对数函数、自然对数以及三角函数等核心功能。C#是一种广泛用于开发桌面应用、Web应用以及游戏...

    C语言课程设计题目汇总.pdf

    16. 简单计算器:实现基本的四则运算,需要理解运算符优先级,可能涉及栈的数据结构。 17. 计算24游戏:涉及到数学逻辑和递归算法,找到数字组合成24的路径。 18. 输入盘子数:可能是汉诺塔问题,需要理解递归算法...

Global site tag (gtag.js) - Google Analytics