用Java实现的一个简单计算器,使用栈实现运算操作

java实现的一个简易计算器

运算功能使用栈实现
计算器界面如下:(试用按例在图片上有所显示)在这里插入图片描述

具体代码如下(如果看不懂可以私信我,记得点赞哦):

PS:我还是个小菜鸟,写的不好处希望大家多多体谅

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.EmptyStackException;
import java.util.Stack;
public class Calculater extends JFrame implements ActionListener{
	private JButton buttons[];
	private String values[]= {"7","8","9","÷","4","5","6","×","1","2","3","-","0",".","=","+","(",")","^","CLEAR"};
	private JTextArea textArea;
	private Container container;
	private JPanel panel1,panel2;
	private static String displayString="";
    private Stack<Float>stack1=new Stack<Float>();//运算分量
    private Stack<String>stack2=new Stack<String>();//运算符
    private String string,value="";
    private String result="";
    private String v1="";
	public Calculater() {
		super("计算器");
		stack1.push((float)0);
		stack2.push("=");
		panel1=new JPanel();
		panel2=new JPanel();
		panel1.setLayout(new FlowLayout());
		panel2.setLayout(new GridLayout(5,4,4,4));
		textArea=new JTextArea("0",2,45);
		panel1.add(textArea);
		buttons=new JButton[values.length];
		for (int i = 0; i < values.length; i++) {
			buttons[i]=new JButton(values[i]);
			buttons[i].setBackground(Color.CYAN);
			panel2.add(buttons[i]);
			buttons[i].addActionListener(this);
		}
		buttons[19].setForeground(Color.red);
		container=getContentPane();
		container.setLayout(new BorderLayout());
		container.add(panel1,BorderLayout.NORTH);
		container.add(panel2,BorderLayout.CENTER);
		setSize(500,600);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public void actionPerformed(ActionEvent event) {
		if(event.getSource().equals(buttons[19])) {//清空栈中的多余数据和清空显示屏,按下CLEAR键的操作
			displayString="";
			v1="";//必须为空,否则下次运算还显示上次的结果
			textArea.setText("0");
			while (!stack2.empty()) {//对栈中进入的错误符号进行清空处理
				stack2.pop();
			}
			stack2.push("=");//符号栈中在栈底始终保存一个“=”作为判定
			while (!stack1.empty()) {//运算分量栈只保存0
				stack1.pop();
			}
			stack1.push((float)0);
		}
		else {
			displayString=displayString+v1+event.getActionCommand();
		    result=calculate(event);
		    if(result=="") {
		    	 textArea.setText(displayString);
		    	 v1="";
		    }
		    else {
		    	 stack1.push((float)0);//处理输入的第一个数为负数
		    	 stack1.push(Float.valueOf(result));//已经得出结果的值继续进行运算
				 textArea.setText(displayString+result);//显示输出的结果
				 v1=result;
			}
		    	
		}
		
	}
	public void oper() {//进行栈顶运算
		float v1,v2;
		float v=0;
		String op;
		int i;
		op=stack2.pop();
		v2=stack1.pop();
		v1=stack1.pop();
		switch (op) {
		case "+":v=v1+v2;//最新版的java可以匹配字符串
			break;
		case "-":v=v1-v2;
		    break;
		case "×":v=v1*v2;
		    break;
	    case "÷":v=v1/v2;
	        break;
	    case "^":v=1;
	        for(i=0;i<(int)v2;i++) {
	        	v=v*v1;
	        }
		    break;
		}
		stack1.push(v);
	}
private Stack<String> vnStack=new Stack<String>();//处理负数
	public String calculate(ActionEvent event) {//计算表达式结果
		string=event.getActionCommand();
		    if(string=="(") {
		    	vnStack.push(string);
		    }
		    else if(!vnStack.empty() && string=="-"){
		    	vnStack.push(string);
			}
			if(string!="+" && string!="-" && string!="×" && string!="÷" && string!="CLEAR" && string!="=" && string!="(" && string!=")" && string!="^") {
				    value+=string; 
				    try{if(vnStack.peek()=="-") {
				    	 stack1.push((float)0);
				    	 while (!vnStack.empty()) {
							vnStack.pop();
						}
				     }
				    else {
			    		 while (!vnStack.empty()) {
								vnStack.pop();
							} 
			    	 }
				    }catch (EmptyStackException e) {
						//System.out.println("vnStack栈为"+e.getMessage());
					}
				}
			else {
				if(value!="") {
				stack1.push(Float.valueOf(value));
				value="";
				float item=stack1.pop();
				System.out.println(item);
				stack1.push(item);
				}
			switch (string) {
			case "(":System.out.println(string);
				     stack2.push(string);
			         break;
			case ")":System.out.println(string);
				     while (stack2.peek()!="(") {
				           oper();
				     }
			         stack2.pop();
			         break;
			case "+":;
			case "-":while (stack2.peek()!= "=" && stack2.peek()!="(") {
                           oper();
                      }
                      stack2.push(string);
                      String v1=stack2.pop();
                      System.out.println(v1);
                      stack2.push(v1);   
                      break;
			case "×":;
			case "÷":System.out.println(string);
				     while (stack2.peek()=="^" || stack2.peek()=="÷" || stack2.peek()=="×") {
				            oper();
			          }
			          stack2.push(string);
			          break;
			case "^":System.out.println(string);
				     while (stack2.peek()=="^") {
				            oper();
			         }
			         stack2.push(string);
			         break;
			}
			if(string=="=") {//输入为等于的情况
				while (stack2.peek()!="=") {
				oper();
				}
				return String.valueOf(stack1.pop());
		    }
			}
			return "";
	}
	public static void main(String []args) {
		new Calculater();
	}
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值