栈的应用:实现简易计算器

栈是一种插入和删除操作都只能在尾端进行的线性表。它具有后进先出的性质,在各种软件系统中有着广泛的应用。

运用栈将中缀表达式转化为后缀表达式

  • 中缀表达式:
    一个二元运算符对应的运算量分别放在其两端,这是人们惯用且容易理解的写法。

  • 后缀表达式:
    一个二元运算符对应的运算量依次放在其左端(即运算符放在两运算量之后)。这一种方法不需要括号来提升子表达式的优先级,且运算符依照出现的先后顺序进行运算,不需要关心后续的表达式,非常适合计算机的计算和存储。

中缀表达式转换为后缀表达式的方法:

  • 手动转换

     - 将所有子表达式按照优先级加上圆括号
     - 在每一个子表达式中,移动运算符的位置到两个运算量之后
     - 去除所有圆括号
    
  • 编程转换

     - 建一个存放运算符的空栈
     - 创建存放后缀表达式的空串
     - 从左往右扫描中缀表达式:
     		* 如果是运算量:进入空串
     		* 如果是运算符:
     			 如此时栈为空:进栈
     			 如此时非空:当前运算符优先级高于栈顶运算符:进栈
     			 如此时非空:当前运算符优先级低于栈顶运算符:将栈顶依次追加到后缀表达式,直到栈为空或者栈顶优先级低于当前运算符
     			 如为 “(” :直接入栈
     			 如为 “)” :将栈顶依次出栈追加到后缀表达式,直到出现 "(“ ,则一并丢弃。
     -扫描结束后,若栈非空,将栈顶依次出栈追加到后缀表达式。
    

简易计算器实现

此计算器能够将用户输入的中缀表达式转化为后缀表达式,完成带有括号的浮点数和多位数的加、减、乘、除、乘方、模运算。

public class Example3_3 {

	public static void main(String[] args) throws Exception {  
		Example3_3 p = new Example3_3();

		Scanner sc = new Scanner(System.in);
		System.out.print("请输入中缀表达式:"); 
		String inFix = sc.nextLine();
		System.out.println();
		
		String postFix = p.covertToPostFix(inFix);
		System.out.println("\n后缀表达式为:" + postFix); 
		
		System.out.println("\n表达式运算结果为:" + p.numberCalculate(postFix));
	} 

	public int priority(char operator)
	{
		switch(operator)
		{
			case '^': return 3;

		    case '%': 
	        case '*':
	        case '/': return 2;

		    case '+':
		    case '-': return 1;
		}
		return 0;
	}
	
	public String covertToPostFix(String inFix) throws Exception{
		if ("".equals(inFix) || inFix == null)
			throw new Exception("错误:算术表达式不能为空");// 抛出异常

		LinkStack<Character> stack = new LinkStack();
		String postFix = "";
		char token=' ',topToken=' ';
		
		for (int i = 0; i < inFix.length(); i++) {
			token = inFix.charAt(i);
		    if (token == '(') {
	       		stack.push(token);
		    } 
		    else if (token == ')') {
		        topToken = stack.pop();
		        while (topToken != '(') {
		        	postFix = postFix + topToken;
		            topToken = stack.pop();
		        }
		    } 
		    else if (isOperator(token)) {
		        while (!stack.isEmpty() && (priority(token) <= priority(stack.peek()))) {
                	topToken = stack.pop();
	                postFix = postFix + topToken;
	            }
	            stack.push(token);
		    } 
		    else{
		    	String number = String.valueOf(token);		    	
		    	while(i<inFix.length()-1){
		    		if((inFix.charAt(i+1)>='0'&&inFix.charAt(i+1)<='9')||inFix.charAt(i+1)=='.'){
		    			number=number.concat(String.valueOf(inFix.charAt(i+1)));
		    			i=i+1;
		    		}
		    		else
		    			break;
		    	}
	            postFix = postFix + number + " ";
		    }	
		}
		
		while (!stack.isEmpty()) {
			token = stack.pop();
		    postFix = postFix + token;
	    }
		
		return(postFix);
	}

	public double numberCalculate(String postFix) throws Exception{
		if ("".equals(postFix) || postFix == null)
			throw new Exception("错误:后缀算术表达式不能为空");// 抛出异常
		
		LinkStack<Double> stack = new LinkStack();
		for (int i = 0; i < postFix.length(); i++){
			char token = postFix.charAt(i);
			if (isOperator(token)){
				Double d2 = stack.pop();
				Double d1 = stack.pop();
				double result = 0;
				
				if (token == '+')	result = d1 + d2;
				if (token == '-')	result = d1 - d2;
				if (token == '*')	result = d1 * d2;
				if (token == '^')	result = Math.pow(d1,d2);
				if (token == '/' && d2 != 0)	result = d1 / d2;
				if (token == '%' && d2 != 0)	result = d1 % d2;
				
				stack.push(result);
				i++;
			}else {
				    int j = postFix.indexOf(" ",i);
				    String number = postFix.substring(i,j);
					stack.push(Double.valueOf(number));
					i=j;
			}
		}
		
		return stack.pop();
	}

	public boolean isOperator(char c){
		return (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%' );
	}
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象课程设计(Java) 题 目:简易计算器 专 业:电子商务 班 级:1110025 学生姓名: 指导老师: 2013 年 1月 6日 目录 一、 设计内容 1 二、设计要求 1 三、总体设计 1 四、具体设计 1 五、程序设计 6 设计体会与小结 15 简易计算器设计 1. 设计内容 设计一个图形界面(GUI)的应用程序,完成简单的运算。通过计算器的编辑来检测和提 升自己的java能力,并最终完成课程设计报告。 二、设计要求 1、应用自己所学课程知识完成对计算器的基本任务。 2、查阅相关资料,学习和掌握项目中涉及的新知识,提高自学能力。 3、通过应用java程序编写计算器来提升对简单的图形界面的了解和掌握。 三、总体设计 该计算器基本运算没有问题,清零、正负号、求倒数、退格功能都能很好的实现,总体 能完成一个计算器的基本功能,但仍有许多地方需要改进,比如小数点的实现所存在的 一些问题,虽然在基本的运算过程当中不会造成太大影响,但这依然不能认为是一个很 好的计算器,同时,在另一方面,该计算器还没能很好的实现连续计算的功能,必须每 次按下等号按钮计算出结果后才能用产生的结果接着进行下一次的计算,改进的方法是 在运算符上同时注册Result类,让运算符同时拥有计算结果的功能。 四、具体设计 1、程序流程图: 2、主要代码展示及说明: 总体代码的设计: 程序主窗体继承JFrame类,使用24个JBotton按钮实现数字和基本功能,并且分别注册监 听,采用6行4列网格布局,完成计算器界面的基本设置,最后对按钮进行计算分析,计 算并显示结果。 这段代码主要是对程序的主框架进行相应的设置 super("简易计算器"); setSize(300,260); this.setLayout(new BorderLayout()); jPanel1=new JPanel(); jPanel1.setLayout(new GridLayout(1,1)); //一行一列的布局 jPanel2=new JPanel(); jPanel2.setLayout(new GridLayout(6,4)); //六行四列的布局 resultField=new JTextField("0"); jPanel1.add(resultField); this.add(jPanel1,BorderLayout.NORTH); this.add(jPanel2,BorderLayout.CENTER); 设置数字按钮1到9并添加监控以及符号等的添加监控 s1=new JButton(" 1 "); s1.addActionListener(this); s2=new JButton(" 2 "); s2.addActionListener(this); s3=new JButton(" 3 "); s3.addActionListener(this); s4=new JButton(" 4 "); s4.addActionListener(this); s5=new JButton(" 5 "); s5.addActionListener(this); s6=new JButton(" 6 "); s6.addActionListener(this); s7=new JButton(" 7 "); s7.addActionListener(this); s8=new JButton(" 8 "); s8.addActionListener(this); s9=new JButton(" 9 "); s9.addActionListener(this); s0=new JButton(" 0 "); s0.addActionListener(this); b1=new JButton(" + "); b1.addActionListener(this); b2=new JButton(" - "); b2.addActionListener(this); b3=new JButton(" * "); b3.addActionListener(this); b4=new JButton(" / "); b4.addActionListener(this); b5=new JButton(" ^ "); b5.addActionListener(this); b6=new JButton(" 开方 "); b6.addActionListener(this); b7=new JButton(" % "); b7.addActionListener(this); b8=new JButton(" x! "); b8.addActionListener(this); b

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值