您的位置:首页 > 其它

四则计算器

2014-10-18 23:20 169 查看
Java实验,实现一个简单的计算器。

逻辑部分已经加入了小括号的处理,但是UI部分括号的输入实在是懒得写了(不然还得加入括号的匹配判断= =),所以就做了个最简单的四则计算器。

程序健壮性方面有一些小瑕疵,比如得把数字的正负符号先调整正确才能按运算符啥的,但是对主要功能没有啥影响。

逻辑部分算法主要用的是中缀表达式转后缀表达式。

中缀表达式转后缀表达式的重点是:1.数字直接入队;2.所有运算符号入栈,并保证每个新入的运算符优先级大于(不等于)它下边紧压着的那个运算符的优先级或是下边紧压着的运算符是左括号;3.所有出栈运算符直接入队;4.左括号直接入栈,右括号出现时将栈中元素不断弹出直到遇见第一个左括号出栈为止,左右括号不入队,右括号不入栈。

package calculator;

import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;

enum NodeKind {number,operator};

class Node
{
public double num;
public char op;
public NodeKind kind;

public Node(double n)
{
num=n;
op='\0';
kind=NodeKind.number;
}

public Node(char ch)
{
num=0;
op=ch;
kind=NodeKind.operator;
}

}

class OPNode
{
public char op;
public int level;

public OPNode(char ch)
{
op=ch;
if('+'==ch||'-'==ch)
{
level=1;
}
else if('*'==ch||'/'==ch)
{
level=2;
}
}

public boolean IsBigEq(OPNode ch)
{
return this.level>=ch.level;
}

public boolean IsSmallEq(OPNode ch)
{
return this.level<=ch.level;
}
}

class Calculat
{
private String Input;
private String Result;
private HashSet<Character> AllowOP=new HashSet<Character>();
private ArrayList<Node> RPExpression=new ArrayList<Node>();

public Calculat()
{
AllowOP.add('+');
AllowOP.add('-');
AllowOP.add('*');
AllowOP.add('/');
AllowOP.add('%');
AllowOP.add('(');
AllowOP.add(')');
AllowOP.add('.');
}

private void StringToRPE()
{
Stack<OPNode> TempStack=new Stack<OPNode>();
double TempNum=0;
double TempDigit=0;
boolean AfterPoint=false;
for(int i=0;i<Input.length();++i)
{
if(Character.isDigit(Input.charAt(i))||'.'==Input.charAt(i))//数字部分
{
if('.'==Input.charAt(i))
{
AfterPoint=true;
TempDigit=0;
continue;
}
if(AfterPoint)//处理小数
{
TempDigit=TempDigit*10+Input.charAt(i)-'0';
if(Input.length()==i+1||(!Character.isDigit(Input.charAt(i+1))))
{
while(TempDigit>=1.0)
{
TempDigit=TempDigit/10;
}
TempNum=TempNum+TempDigit;
RPExpression.add(new Node(TempNum));
TempNum=0;
AfterPoint=false;
}
}
else
{
TempNum=TempNum*10+Input.charAt(i)-'0';
if(Input.length()==i+1||(!Character.isDigit(Input.charAt(i+1))&&!('.'==Input.charAt(i+1))))
{
RPExpression.add(new Node(TempNum));
TempNum=0;
}
}
}
else if(AllowOP.contains(Input.charAt(i)))//非数字部分
{
char CurrentChar=Input.charAt(i);
if('('==CurrentChar)
{
TempStack.push(new OPNode(CurrentChar));
}
else if(')'==CurrentChar)
{
char TempChar;
while('('!=TempStack.peek().op)
{
TempChar=TempStack.peek().op;
RPExpression.add(new Node(TempChar));
TempStack.pop();
}
TempStack.pop();
}
else
{
OPNode TempNode=new OPNode(CurrentChar);
if(TempStack.empty())
{
TempStack.push(TempNode);
}
else
{
OPNode Top=TempStack.peek();
if(TempNode.IsBigEq(Top))
{
TempStack.push(TempNode);
}
else
{
while(TempNode.IsSmallEq(Top)&&'('!=Top.op)
{
RPExpression.add(new Node(Top.op));
TempStack.pop();
if(TempStack.empty())
{
Top=null;
break;
}
Top=TempStack.peek();
}
TempStack.push(TempNode);
}
}
}
}
}
if(!TempStack.empty())
{
while(!TempStack.empty())
{
RPExpression.add(new Node(TempStack.peek().op));
TempStack.pop();
}
}
}

private void Result() //根据后缀表达式计算结果
{
int i=0;
double Num1=0,Num2=0,Result=0;
Node TempNode;
Stack<Double> TempStack=new Stack<Double>();

this.Result=null;
while(RPExpression.size()!=i)
{
TempNode=RPExpression.get(i);
if(NodeKind.number==TempNode.kind)
{
TempStack.push(TempNode.num);
}
else if(NodeKind.operator==TempNode.kind)
{
try
{
Num2=TempStack.peek();
TempStack.pop();
Num1=TempStack.peek();
TempStack.pop();
}catch(EmptyStackException e)
{
e.printStackTrace();
}
switch(TempNode.op)
{
case '+':
Result=Num1+Num2;
break;
case '-':
Result=Num1-Num2;
break;
case '*':
Result=Num1*Num2;
break;
case '/':
try
{
Result=Num1/Num2;
}catch(ArithmeticException e)
{
this.Result="Error";
e.printStackTrace();
}
break;
}
TempStack.push(Result);
}
++i;
}
if(this.Result==null)
{
this.Result=TempStack.peek().toString();
}
}

public String Display()
{
StringToRPE();
Result();
System.out.println(Result);
return Result;
}

public void InputString(String s)
{
Input=s;
}
}

package calculator;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import calculator.*;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

//这个文件就是一堆界面,拿WindowBuilder拖一拖而已,没什么实际内容= =值得注意的就是负数全部处理为(0-x)的形式方便后续运算
public class Calculator
{
private JFrame frame;
private JTextField textField;
private JTextField textField_1;

private String display;
private String display_num;
private String input;
private Calculat C=new Calculat();

/**
* Launch the application.
*/
public static void main(String[] args)
{

//Calculate C;

EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Calculator window = new Calculator();
window.frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public Calculator()
{
initialize();
}

/**
* Initialize the contents of the frame.
*/
private void initialize()
{
frame = new JFrame();
frame.setBounds(100, 100, 314, 260);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton button = new JButton("7");
button.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="7";
}
else
{
display_num+="7";
}
textField.setText(display_num);
}
});
button.setFont(new Font("Dialog", Font.PLAIN, 9));
button.setBounds(10, 89, 52, 23);
frame.getContentPane().add(button);

JButton button_1 = new JButton("4");
button_1.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="4";
}
else
{
display_num+="4";
}
textField.setText(display_num);
}
});
button_1.setFont(new Font("Dialog", Font.PLAIN, 9));
button_1.setBounds(10, 122, 52, 23);
frame.getContentPane().add(button_1);

JButton button_2 = new JButton("1");
button_2.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="1";
}
else
{
display_num+="1";
}
textField.setText(display_num);
}
});
button_2.setFont(new Font("Dialog", Font.PLAIN, 9));
button_2.setBounds(10, 155, 52, 23);
frame.getContentPane().add(button_2);

JButton button_3 = new JButton("8");
button_3.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="8";
}
else
{
display_num+="8";
}
textField.setText(
4000
display_num);
}
});
button_3.setFont(new Font("Dialog", Font.PLAIN, 9));
button_3.setBounds(64, 89, 52, 23);
frame.getContentPane().add(button_3);

JButton button_4 = new JButton("5");
button_4.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="5";
}
else
{
display_num+="5";
}
textField.setText(display_num);
}
});
button_4.setFont(new Font("Dialog", Font.PLAIN, 9));
button_4.setBounds(64, 122, 52, 23);
frame.getContentPane().add(button_4);

JButton button_5 = new JButton("2");
button_5.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="2";
}
else
{
display_num+="2";
}
textField.setText(display_num);
}
});
button_5.setFont(new Font("Dialog", Font.PLAIN, 9));
button_5.setBounds(64, 155, 52, 23);
frame.getContentPane().add(button_5);

JButton button_6 = new JButton("0");
button_6.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="0";
}
else
{
display_num+="0";
}
textField.setText(display_num);
}
});
button_6.setFont(new Font("Dialog", Font.PLAIN, 11));
button_6.setBounds(10, 188, 106, 23);
frame.getContentPane().add(button_6);

JButton button_7 = new JButton("3");
button_7.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="3";
}
else
{
display_num+="3";
}
textField.setText(display_num);
}
});
button_7.setFont(new Font("Dialog", Font.PLAIN, 9));
button_7.setBounds(126, 155, 44, 23);
frame.getContentPane().add(button_7);

JButton button_8 = new JButton("6");
button_8.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="6";
}
else
{
display_num+="6";
}
textField.setText(display_num);
}
});
button_8.setFont(new Font("Dialog", Font.PLAIN, 9));
button_8.setBounds(126, 122, 44, 23);
frame.getContentPane().add(button_8);

JButton button_9 = new JButton("9");
button_9.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num="9";
}
else
{
display_num+="9";
}
textField.setText(display_num);
}
});
button_9.setFont(new Font("Dialog", Font.PLAIN, 9));
button_9.setBounds(126, 89, 44, 23);
frame.getContentPane().add(button_9);

JButton button_10 = new JButton(".");
button_10.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if(null==display_num)
{
display_num=".";
}
else
{
display_num+=".";
}
textField.setText(display_num);
}
});
button_10.setFont(new Font("Dialog", Font.PLAIN, 9));
button_10.setBounds(126, 189, 44, 23);
frame.getContentPane().add(button_10);

JButton button_11 = new JButton("/");
button_11.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
String temp = null;
if(null==display)
{
display=display_num+"/";
}
else
{
display=display+display_num+"/";
}

if('-'==display_num.charAt(0))
{
temp="(0"+display_num+")";
}
else
{
temp=display_num;
}

if(null==input)
{
input=temp+"/";
}
else
{
input=input+temp+"/";
}

display_num=null;
textField_1.setText(display);
}
});
button_11.setFont(new Font("Dialog", Font.PLAIN, 9));
button_11.setBounds(180, 89, 44, 23);
frame.getContentPane().add(button_11);

JButton button_12 = new JButton("*");
button_12.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
String temp = null;
if(null==display)
{
display=display_num+"*";
}
else
{
display=display+display_num+"*";
}

if('-'==display_num.charAt(0))
{
temp="(0"+display_num+")";
}
else
{
temp=display_num;
}

if(null==input)
{
input=temp+"*";
}
else
{
input=input+temp+"*";
}

display_num=null;
textField_1.setText(display);
}
});
button_12.setFont(new Font("Dialog", Font.PLAIN, 9));
button_12.setBounds(180, 122, 44, 23);
frame.getContentPane().add(button_12);

JButton button_13 = new JButton("-");
button_13.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
String temp = null;
if(null==display)
{
display=display_num+"-";
}
else
{
display=display+display_num+"-";
}

if('-'==display_num.charAt(0))
{
temp="(0"+display_num+")";
}
else
{
temp=display_num;
}

if(null==input)
{
input=temp+"-";
}
else
{
input=input+temp+"-";
}

display_num=null;
textField_1.setText(display);
}
});
button_13.setFont(new Font("Dialog", Font.PLAIN, 9));
button_13.setBounds(180, 155, 44, 23);
frame.getContentPane().add(button_13);

JButton button_14 = new JButton("+");
button_14.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
String temp = null;
if(null==display)
{
display=display_num+"+";
}
else
{
display=display+display_num+"+";
}

if('-'==display_num.charAt(0))
{
temp="(0"+display_num+")";
}
else
{
temp=display_num;
}

if(null==input)
{
input=temp+"+";
}
else
{
input=input+temp+"+";
}

display_num=null;
textField_1.setText(display);
}
});
button_14.setFont(new Font("Dialog", Font.PLAIN, 9));
button_14.setBounds(180, 189, 44, 23);
frame.getContentPane().add(button_14);

JButton button_15 = new JButton("=");
button_15.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
display=display+display_num;
textField_1.setText(display);

if(null==input)
{
display="Error!";
}
else
{
if('-'==display_num.charAt(0))
{
input=input+"(0"+display_num+")";
}
else
{
input=input+display_num;
}
System.out.println(input);
C.InputString(input);
display=C.Display();
}

textField.setText(display_num);
textField_1.setText(display);
input=null;
display=null;
display_num=null;
}
});
button_15.setFont(new Font("Dialog", Font.PLAIN, 9));
button_15.setBounds(234, 156, 54, 56);
frame.getContentPane().add(button_15);

JButton button_16 = new JButton("+/-");
button_16.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
if('-'==display_num.charAt(0))
{
display_num=display_num.substring(1,display_num.length());
}
else
{
display_num="-"+display_num;
}
textField.setText(display_num);
}
});
button_16.setFont(new Font("Dialog", Font.PLAIN, 9));
button_16.setBounds(234, 90, 54, 23);
frame.getContentPane().add(button_16);

JButton button_17 = new JButton("%");
button_17.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
String temp = null;
if(null==display)
{
display=display_num+"%";
}
else
{
display=display+display_num+"%";
}

if('-'==display_num.charAt(0))
{
temp="(0"+display_num+")";
}
else
{
temp=display_num;
}

if(null==input)
{
input=temp+"%";
}
else
{
input=input+temp+"%";
}

display_num=null;
textField_1.setText(display);
}
});
button_17.setFont(new Font("Dialog", Font.PLAIN, 9));
button_17.setBounds(234, 123, 54, 23);
frame.getContentPane().add(button_17);

textField = new JTextField();
textField.setEditable(false);
textField.setHorizontalAlignment(JTextField.RIGHT);
textField.setBounds(10, 46, 278, 33);
frame.getContentPane().add(textField);
textField.setColumns(10);

textField_1 = new JTextField();
textField_1.setEditable(false);
textField_1.setHorizontalAlignment(JTextField.RIGHT);
textField_1.setBounds(10, 3, 278, 33);
frame.getContentPane().add(textField_1);
textField_1.setColumns(10);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 中缀转后缀