想用java实现一个计算器,其中用到了栈,我的代码如下:
Calculate.java
import java.util.*;class Calculate {
    private Stack<Character> sign = new Stack<Character>();
    private ArrayList<Character> list = new ArrayList<Character>();
    public void addToStack( char c ){
    System.out.println("addToStack");
        sign.push( c );
System.out.println("符号栈中元素个数为"+sign.size());
    }
public void addToList( char c ){
    System.out.println("addToList");
list.add( c );
}
public void deleteChar(){
System.out.println("deleteChar");
}
public void emptyStack(){
    System.out.println("emptyStack");

}
public void emptyList(){
System.out.println("emptyList");
}
public String result(){
    return "结果";
    }
}  
UI.java
import javax.swing.*;    
import java.awt.*;   class UI {
    private JFrame myCalculate;
private JPanel contentPanel;
private JPanel buttonPanel;
private JTextField result;
private JButton bracketLeft;
private JButton bracketRight;
private JButton num0;
private JButton num1;
private JButton num2;
private JButton num3;
private JButton num4;
private JButton num5;
private JButton num6;
private JButton num7;
private JButton num8;
private JButton num9;
private JButton add;
private JButton sub;
private JButton mul;
private JButton div;
private JButton dot;
private JButton equal;
private JButton delete;
private JButton empty;
private Listener myListener;
public UI(){
    myCalculate = new JFrame("计算器");
contentPanel = new JPanel();
BorderLayout borderLayout = new BorderLayout();
borderLayout.setVgap(20);
contentPanel.setLayout(borderLayout);
myCalculate.setContentPane(contentPanel);
result = new JTextField(20);
result.setEditable(false);
bracketLeft = new JButton("(");
bracketRight = new JButton(")");
num0 = new JButton("0");
num1 = new JButton("1");
num2 = new JButton("2");
num3 = new JButton("3");
num4 = new JButton("4");
num5 = new JButton("5");
num6 = new JButton("6");
num7 = new JButton("7");
num8 = new JButton("8");
num9 = new JButton("9");
add = new JButton("+");
sub = new JButton("-");
mul = new JButton("×");
div = new JButton("÷");
dot = new JButton(".");
equal = new JButton("=");
delete = new JButton("删除");
empty = new JButton("清空");
myListener = new Listener();
bracketLeft.addActionListener(myListener);
bracketRight.addActionListener(myListener);
num0.addActionListener(myListener);
num1.addActionListener(myListener);
num2.addActionListener(myListener);
num3.addActionListener(myListener);
num4.addActionListener(myListener);
num5.addActionListener(myListener);
num6.addActionListener(myListener);
num7.addActionListener(myListener);
num8.addActionListener(myListener);
num9.addActionListener(myListener);
add.addActionListener(myListener);
sub.addActionListener(myListener);
mul.addActionListener(myListener);
div.addActionListener(myListener);
dot.addActionListener(myListener);
equal.addActionListener(myListener);
delete.addActionListener(myListener);
empty.addActionListener(myListener);
buttonPanel = new JPanel();
GridLayout gridLayout = new GridLayout(5,4);
gridLayout.setHgap(10);
gridLayout.setVgap(30);
buttonPanel.setLayout(gridLayout);
buttonPanel.add(bracketLeft);
buttonPanel.add(bracketRight);
buttonPanel.add(delete);
buttonPanel.add(empty);
buttonPanel.add(num7);
buttonPanel.add(num8);
buttonPanel.add(num9);
buttonPanel.add(div);
buttonPanel.add(num4);
buttonPanel.add(num5);
buttonPanel.add(num6);
buttonPanel.add(mul);
buttonPanel.add(num1);
buttonPanel.add(num2);
buttonPanel.add(num3);
buttonPanel.add(sub);
buttonPanel.add(equal);
buttonPanel.add(dot);
buttonPanel.add(num0);
buttonPanel.add(add);
contentPanel.add("North",result);
contentPanel.add("Center",buttonPanel);
myCalculate.setSize(300,350);
myCalculate.setVisible(true);
myCalculate.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
}
public void setString( String s ){
    result.setText( s );
}
public void addString( String s ){
    result.setText( result.getText() + s );
}
public void deleteChar(){
    System.out.println("deleteChar");
}
}
Listener.java
import java.awt.event.*;class Listener implements ActionListener {
    private boolean isSign( char c ){
    switch( c ){
    case '(':
case ')':
case '+':
case '-':
case '×':
case '÷':return true;
default:return false;
}
}
private boolean isNum( char c){
    if( c >= '.'&&c <= '9')
    return true;
else
    return false;
}
    public void actionPerformed( ActionEvent e ){
    Calculate myCalculate = new Calculate();
//     System.out.println( e.getActionCommand() );
// Main.calculate.setString( e.getActionCommand() );
        String button = e.getActionCommand();
char c = (button.toCharArray())[0];
if( isSign( c ) )
    myCalculate.addToStack( c );//把符号添加到栈里
        else if( isNum( c ) ){
            Main.calculate.addString( button );//把操作数添加到文本框里
myCalculate.addToList( c );//把操作数添加到输出序列中
        }
        else if( button.equals( "删除" ) ){
    Main.calculate.deleteChar();
            myCalculate.deleteChar();
        }
        else if( button.equals( "清空" ) ){
            Main.calculate.setString("");
myCalculate.emptyStack();
myCalculate.emptyList();
        }
        else if( c == '=' )
            Main.calculate.setString( myCalculate.result() );
}
}
Main.java
public class Main{
    static UI calculate;
    public static void main( String[] args ){
        calculate = new UI();
    }
}
当我在界面中按一个运算符按键(+,-,*,/和括号)时,我想把运算符存到Calculate中定义的栈中,当我按多个运算符后,栈中应该有多个元素,可是为什么我的Calculate类中的addToStack()方法每次都输出“个数为1”呢?我看了半天没找出原因在哪里,旁观者清,请各位帮忙看看。

解决方案 »

  1.   

    class Listener implements ActionListener {
    Calculate myCalculate = new Calculate();//把这个Calculate对象设置为全局对象
        private boolean isSign( char c ){
            switch( c ){
                case '(':
                case ')':
                case '+':
                case '-':
                case '×':
                case '÷':return true;
                default:return false;
            }
        }
        private boolean isNum( char c){
            if( c >= '.'&&c <= '9')
                return true;
            else
                return false;
        }
        public void actionPerformed( ActionEvent e ){
            
    //        System.out.println( e.getActionCommand() );
    //        Main.calculate.setString( e.getActionCommand() );
            String button = e.getActionCommand();
            char c = (button.toCharArray())[0];
            if( isSign( c ) )
                myCalculate.addToStack( c );//把符号添加到栈里
            else if( isNum( c ) ){
                Main.calculate.addString( button );//把操作数添加到文本框里
                myCalculate.addToList( c );//把操作数添加到输出序列中
            }
            else if( button.equals( "删除" ) ){
                Main.calculate.deleteChar();
                myCalculate.deleteChar();
            }
            else if( button.equals( "清空" ) ){
                Main.calculate.setString("");
                myCalculate.emptyStack();
                myCalculate.emptyList();
            }    
            else if( c == '=' )
                Main.calculate.setString( myCalculate.result() );        
        }
    }
    你的代码中
    public void actionPerformed( ActionEvent e ){
            Calculate myCalculate = new Calculate();
    ...}这样写,你给事件注册句柄,每次调用这个句柄函数的时候都会new一个Calculate,改成上面那样就可以了