一、GUI界面的实现
class CalculatorClass implements ActionListener{
JFrame f;
JPanel panel1,panel2,panel3,panel4,panel5,panel6,panel7;
JTextArea area;;
String []a= {"MC","7","8","9","/","%","(","4","5","6","*","x!",")","1","2","3","-",
"ln","0","sin","cos",".","+","="};
String []b= {"BackSpace","C"};
JButton []Button1,Button2,Button3;
CalculatorClass() throws IOException{
f=new JFrame("Calculator");
f.setLayout(new BorderLayout(0,0));
panel1=new JPanel(new BorderLayout(0,0));
panel1.isBackgroundSet();panel1.setBackground(Color.black);
panel2=new JPanel(new GridLayout(4,6,10,10));
panel3=new JPanel(new BorderLayout());
panel4=new JPanel(new BorderLayout(0,0));
panel5=new JPanel();
panel5.setLayout(new FlowLayout(FlowLayout.LEFT));
panel5.setSize(300,20);
panel6=new JPanel();
panel6.setBorder(BorderFactory.createRaisedBevelBorder());
panel6.setBackground(Color.WHITE);
panel7=new JPanel(new GridLayout(1,3,7,20));
panel3.add(BorderLayout.WEST,panel6);
panel3.add(BorderLayout.CENTER,panel7);
panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
f.setSize(800, 700);
f.add(BorderLayout.CENTER,panel1);
area=new JTextArea(3,1);
Font ziti = new Font("粗体",Font.BOLD,40);
area.setFont(ziti);
area.setLineWrap(true);
panel4.add(BorderLayout.CENTER,area);
String []c= {};
Button3=new JButton[c.length];
for(int i=0;i<c.length;i++) {
Button3[i]=new JButton(c[i]);
Button3[i].setMargin(new Insets(0,0,0,0));
panel5.add(Button3[i]);
}
panel4.add(BorderLayout.NORTH,panel5);
f.add(BorderLayout.NORTH,panel4);
panel1.add(BorderLayout.CENTER,panel2);
panel1.add(BorderLayout.NORTH,panel3);
Font font1=new Font("粗体",Font.BOLD,35);
Font font2=new Font("粗体",Font.BOLD,45);
Button1=new JButton[a.length];
Button2=new JButton[b.length];
for(int i=0;i<a.length;i++) {
Button1[i]=new JButton(a[i]);
Button1[i].setMargin(new Insets(0,0,0,0));
Button1[i].setBackground(Color.WHITE);
Button1[i].setForeground(Color.BLACK);
Button1[i].setFont(font2);
Button1[i].addActionListener(this);
panel2.add(Button1[i]);
}
panel2.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
for(int i=0;i<b.length;i++) {
Button2[i]=new JButton(b[i]);
Button2[i].setMargin(new Insets(0,0,0,0));
Button2[i].setBackground(Color.WHITE);
Button2[i].setForeground(Color.red);
Button2[i].setSize(250, 100);
Button2[i].setFont(font1);
Button2[i].addActionListener(this);
panel7.add(Button2[i]);
}
f.setVisible(true);
}
二、创建双栈
1、创建一个存储中间数据以及最终结果的栈
class Stack1 {
ArrayList<Double> list = new ArrayList<>();
public void push(Double o){
list.add(o);
}
public int prior(char a)
{
if(a=='*'||a=='/')
return 4;
else if(a=='+'||a=='-')
return 3;
else if(a=='(')
return 2;
else if(a=='#')
return 1;
else
return 0;
}
public Double getTop() {
Double o = list.get(list.size() - 1);
return o;
}
public Double pop(){
Double o = list.get(list.size() - 1);
list.remove(o);
return o;
}
public void output(){
System.out.println(list);
}
}
2、创建一个存储运算符的栈
class Stack2 {
ArrayList<Character> list = new ArrayList<>();
public void push(Character o){
list.add(o);
}
public Character getTop() {
Character o = list.get(list.size() - 1);
return o;
}
public boolean isEmpty() {
if(list.isEmpty()) {
return true;
}
else {
return false;
}
}
public Character pop(){
Character o = list.get(list.size() - 1);
list.remove(o);
return o;
}
public void output(){
System.out.println(list);
}
}
三、括号匹配函数
boolean match(char str[])
{
Stack2 s=new Stack2();
int k,flag=1;
Character ch,e;
for(k=0;k<str.length&&(flag==1);k++) {
if(str[k]!='('&&str[k]!=')') {
continue;
}
switch(str[k])
{
case '(': ch=str[k];s.push(ch);break;
case ')':
if(!s.isEmpty()) {
e=s.getTop();
if(e=='(') {
ch=s.pop();
}
else
flag=0;
}
else {
flag=0;
}
break;
}
}
if(flag==1&&s.isEmpty()) {
return true;
}
else {
return false;
}
}
四、计算函数
Double compute(char a2[]) {
Stack1 L1=new Stack1();
Stack2 L2=new Stack2();
Character z,ch,y;
char []a=new char[50];
char []b=new char[50];
char[]c=new char[50];
Arrays.fill(b, '\0');
Arrays.fill(c, '\0');
Arrays.fill(a, '\0');
int i,j=0,n,k=a2.length;
double x1,x2,x;
L2.push('#');
System.arraycopy(a2, 0, a, 0, a2.length);
a[k]='#';
System.arraycopy(a, 0, b, 0, a.length);
if(a[0]=='-') {
for(n=0;a[n]!='\0';n++)
b[n+1]=a[n];
b[0]='0';
}
System.arraycopy(b, 0, a, 0, b.length);
for(i=0;a[i]!='\0';i++) {
if(a[i]=='('&&a[i+1]=='-') {
for(n=i;a[n]!='\0';n++)
b[n+2]=a[n+1];
b[i+1]='0';
}
}
for(i=0;b[i]!='\0';i++)
{
if(b[i]>='0'&&b[i]<='9') {
while(b[i]>='0'&&b[i]<='9'||b[i]=='.') {
c[j]=b[i];
i++;
j++;
}
char []d=new char[j];
System.arraycopy(c, 0, d, 0, j);
j=0;
Double t=Double.parseDouble(new String(d));
L1.push(t);
Arrays.fill(c, '\0');
}
if(b[i]=='(') {
Character t=b[i];
L2.push(t);
}
if(b[i]==')') {
do {
z=L2.pop();
try {
switch(z)
{
case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
}
}catch(ArithmeticException e) {
area.append("\r\n"+"\t"+"分母!=0");
}
z=L2.getTop();
}while(z!='(');
z=L2.pop();
}
if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*') {
ch=L2.getTop();
if(L1.prior(b[i])>L1.prior(ch)) {
Character t=b[i];
L2.push(t);
}
else {
do {
ch=L2.pop();
try {
switch(ch)
{
case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
}
}catch(ArithmeticException e) {
area.append("\r\n"+"\t"+"分母!=0");
}
ch=L2.getTop();
}while(L1.prior(ch)>=L1.prior(b[i]));
Character t=b[i];
L2.push(t);
}
}
if(b[i]=='#') {
y=L2.getTop();
while(y!='#') {
y=L2.pop();
try {
switch(y)
{
case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
}
}catch(ArithmeticException e) {
area.append("\r\n"+"\t"+"分母!=0");
}
y=L2.getTop();
}
}
}
x=L1.pop();
return x;
}
五、将函数与GUI界面监听结合
public void actionPerformed(ActionEvent e) {
for(int i=0;i<a.length;i++) {
if(e.getActionCommand()==a[i]&&i!=0&&i!=5&&i!=11&&i!=17&&i!=19&&i!=20) {
area.append(a[i]);
}
else {
continue;
}
}
if(e.getActionCommand()=="BackSpace"&&(area.getText()).length()!=0) {
area.setText(area.getText().substring(0, area.getText().length()-1));
}
if(e.getActionCommand()=="C") {
area.setText("");
}
if(e.getActionCommand()=="=") {
StringBuffer a=new StringBuffer(area.getText());
a.deleteCharAt(a.length()-1);
if(this.match(a.toString().toCharArray())) {
Double m=this.compute(a.toString().toCharArray());
double result=m;
area.append("\r\n"+"\t\t\t\t"+String.format("%.5f", result));
}
else {
area.append("\r\n"+"\t"+"括号不匹配!");
}
}
}
}