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();
}
}