java简易计算机(用栈实现中缀转后缀,计算后缀表达式)

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java简易计算机(用栈实现中缀转后缀,计算后缀表达式)相关的知识,希望对你有一定的参考价值。

这学期java课的一个小作业,用java编一个小计算器。
个人认为要点在于:
1.计算机的布局,即按钮和输出框的布局需要知道怎么操作,按钮的大小和字体的大小颜色、不同布局中按钮的改变大小等等
2.用栈将中缀表达式转换为后缀表达式
3.用栈将后缀表达式计算出来
其他问题应该不大,因为只是涉及到简单的加减乘除运算。
我的这个计算器有以下功能:
1.支持加减乘除运算,支持括号功能,小数点功能。
2.支持删除一位的操作。
3.支持计算结果继续进行计算的功能。
4.点击=后原表达式消失,只出现结果,一般保留一位小数。
目前发现的缺陷:
1.负数开头无法实现
2.输入错误表达式后,必须要再输入一次正确表达式后,才能正常开始运算,找不着bug,挺奇怪的,希望老师看不到
等等
但是我都通过trycatch将异常捕获,统一在界面输出操作“非法输入,请按两次AC后重新操作”。
以下是界面展示:


下面直接上代码了

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;

public class Computerhomework extends JFrame implements ActionListener
	JTextField textField = new JTextField("");
	String input = "";
	JButton b[] = new JButton[20];
    JPanel panel = new JPanel();
    JPanel panel1 = new JPanel();
    String name [] = "9","8","7","D","AC","6","5","4","-","(","3","2","1","*",")","0",".","=","/","+";
    Stack<String> houzhui = new Stack<>();
	public Computerhomework() 
		this.setTitle("Computer");
		this.setSize(600, 700);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	
	public void board() 
		textField.setPreferredSize(new Dimension(600,80));
		textField.setFont(new Font("宋体",Font.PLAIN,30));
		textField.setEditable(false);   
	    panel1.add(textField);
	    panel.setLayout(new GridLayout(4,4,5,5));
	    panel1.setLayout(new FlowLayout(3));
	    this.add(panel, BorderLayout.CENTER);
	    this.add(panel1, BorderLayout.NORTH);
	    for(int i=0;i<name.length;i++)//添加按钮
        
            b[i] = new JButton(name[i]);
            b[i].setBackground(new Color(162,192,142));
            b[i].setForeground(Color.BLACK);  //设置按键颜色
            b[i].setFont(new Font("宋体",Font.PLAIN,50));//设置字体格式
            panel.add(b[i]);//将按键添加到界面
            b[i].addActionListener(this);
        
	
	
	@Override
	public void actionPerformed(ActionEvent e)
	
		int flag_feifa = 0;
		try 

			for(int i = 0; i<name.length; i++) 
				if(e.getSource() == b[i] && name[i] == "AC") 
					textField.setText("");
					input = "";
				
				else if(e.getSource() == b[i] && name[i] == "D") 
					String t =  textField.getText();
					String flag = t.substring(t.length()-1);

					if(flag.equals("+") || flag.equals("-") || flag.equals("*") || flag.equals("/") || flag.equals("(") || flag.equals(")")) 
						textField.setText(t.substring(0, t.length()-1));
						input = input.substring(0,input.length() - 3);
					
					else 
						textField.setText(t.substring(0, t.length()-1));
						input = input.substring(0,input.length() - 1);
					
					
				
				else if(e.getSource() == b[i] && name[i] =="(") 
					textField.setText(textField.getText() + e.getActionCommand() );
					input +=e.getActionCommand() + " ";
				
				else if(e.getSource() == b[i] && name[i] == ")") 
					textField.setText(textField.getText() + e.getActionCommand() );
					input += " "+e.getActionCommand();
				
				else if(e.getSource() == b[i] && name[i] == "=") 
					    System.out.println(input);
						String r = result(to_houzhui(input));
						input = r;
						textField.setText(r);
				
				else if(e.getSource() == b[i] && (name[i] == "+" || name[i] == "-" || name[i]=="*" || name[i] =="/")) 
					textField.setText(textField.getText() + e.getActionCommand() );
					input += " " + e.getActionCommand() + " ";
				
				else if(e.getSource() == b[i]) 
					textField.setText(textField.getText() + e.getActionCommand() );
					input += e.getActionCommand();
				
			
			
		
		catch(Exception x) 
			textField.setText("非法输入,请按两次AC后重新操作");
			input = "";
			flag_feifa = 1;
		
		
	
	
	public String to_houzhui(String in) 
		String hou = "";
		String s[] = in.split(" ");
//		System.out.println(s.length);
//		for(String t:s) 
//			System.out.println(t);
//		
		for(int i=0; i<s.length; i++) 
//			.getClass().toString()获取数据类型 1*1*1*(11+1-44*21/11)
			char flag = s[i].charAt(0); //取出字符串的第一个字符作为判断
			if(flag >= '0' && flag <= '9' && i==0) 
				hou += s[i]; //数字加入后缀表达式
			
			else if(flag >= '0' && flag <= '9') 
				hou += " "+s[i]; //数字加入后缀表达式
			
			else if(houzhui.empty() == true) 
				houzhui.push(s[i]); //栈为空直接入栈
			
			else if(flag == '(') houzhui.push(s[i]);
			else if(houzhui.peek().equals("(")) 
				houzhui.push(s[i]); //栈顶为左括号,入栈
			
			else if(flag == ')') 
				while(houzhui.peek().equals("(") != true) 
					hou += " "+houzhui.peek();
					houzhui.pop();
					
				houzhui.pop(); //将(也pop掉
			
			else if((flag == '+' || flag == '-') && (houzhui.peek().equals("*") || houzhui.peek().equals("/") || houzhui.peek().equals("+") || houzhui.peek().equals("-"))) 

				//低优先级遇到高优先级,高优先级出栈,低优先级入栈,平级也是先出再入
				String f = houzhui.peek();
				while((f.equals("+") || f.equals("-")||f.equals("*")||f.equals("/"))&&!houzhui.empty()) 
					hou += " " + f;
					houzhui.pop();
					if(!houzhui.empty())f = houzhui.peek();
				
				houzhui.push(s[i]);
			
			else if((flag == '*' || flag == '/' )&& (houzhui.peek().equals("+")|| houzhui.peek().equals("-"))) 
				//*/为这里最高阶的运算符,遇到低级压入栈12*(12+12-14*13)
				houzhui.push(s[i]);
			
			else
				//最高级遇到同级,先出后进
				String f = houzhui.peek();
				while((f.equals("*") || f.equals("/"))&&!houzhui.empty() ) 
					hou += " " + f;
					houzhui.pop();
					if(!houzhui.empty())f = houzhui.peek();
				
				houzhui.push(s[i]);
			

		
		while(!houzhui.empty()) 
			hou += " "+houzhui.peek();
			houzhui.pop();
		
		
		return hou;
	
	
	public String result(String s) 
		double sum = 0;
		String item[] = s.split(" ");
		Stack<String> res = new Stack<>();
		for(int i=0; i<item.length; i++) 
			if(item[i].charAt(0)>'0' && item[i].charAt(0)<'9') 
				res.push(item[i]);
			
			else if(item[i].equals("+")) 
				double x = Double.parseDouble(res.peek());
				res.pop();
				double y = Double.parseDouble(res.peek());
				res.pop();
				String z = String.valueOf(y+x);
				res.push(z);
			
			else if(item[i].equals("-")) 
				double x = Double.parseDouble(res.peek());
				res.pop();
				double y = Double.parseDouble(res.peek());
				res.pop();
				String z = String.valueOf(y-x);
				res.push(z);
			
			else if(item[i].equals("*")) 
				double x = Double.parseDouble(res.peek());
				res.pop();
				double y = Double.parseDouble(res.peek());

以上是关于java简易计算机(用栈实现中缀转后缀,计算后缀表达式)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏->用栈求解表达式(中缀表达式后缀表达式)

Java中缀表达式转后缀表达式并计算后缀表达式的值

前缀、中缀、后缀表达式是怎样的?(程序设计)

中缀式转后缀式求表达式结果

堆栈入门-简单计算器模板-中缀转后缀

中缀表达式转后缀表达式--C# 代码实现