利用栈操作进行计算,栈s1存放数字数据,栈s2存放运算符数据,将表达式数组遍历,遇到数字入栈s1,遇到运算符,若运算符为"(",则入栈s2,否则遇到运算优先级大于s2栈顶元素时,入栈s2,否则出栈进行计算,计算时,将s1栈中出栈两个数字元素,与s2栈的栈顶运算符进行计算,并将计算结果存入s1栈,若遇到")",则出栈s2计算,直到遇到第一个"(",最后若栈s2不为空,则出栈计算直到栈空,最后将表达式结果存放在栈s1中,读取s1栈顶即得到表达式结果
class CounterGUI extends JFrame {
JPanel topPanel;
JPanel centerPanel;
JTextArea textField;
JScrollPane jsp;
JButton button1;
JButton button2;
JButton button3;
JButton button4;
JButton button5;
JButton button6;
JButton button7;
JButton button8;
JButton button9;
JButton button0;
JButton buttonAdd;
JButton buttonSub;
JButton buttonMul;
JButton buttonDiv;
JButton buttonCle;
JButton buttonDel;
JButton buttonRes;
JButton buttonPoi;
JButton buttonLef;//左括号
JButton buttonRig;//右括号
String expression = "";//表达式
Font f = new Font("楷体", Font.BOLD, 30);
Font f1 = new Font("黑体", Font.BOLD, 30);
public CounterGUI() {
setTitle("计算器");
setBounds(100, 100, 550, 520);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(null);
topPanel = new JPanel();
topPanel.setBounds(10, 10, 510, 50);
topPanel.setLayout(new BorderLayout());
textField = new JTextArea();
textField.setFont(f);
textField.setEditable(false);
textField.setForeground(Color.white);
textField.setBackground(Color.BLACK);
// textField.setEnabled(false);
jsp = new JScrollPane(textField);
topPanel.add(jsp);
centerPanel = new JPanel();
centerPanel.setBounds(10, 70, 510, 400);
centerPanel.setLayout(new GridLayout(4, 5));
button1 = new JButton("1");
button1.setFont(f1);
button1.setBackground(Color.CYAN);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 1";
} else {
expression += "1";
}
textField.append("1");
}else if("".equals(temp)){
textField.append("1");
expression += "1";
}
}
});
button2 = new JButton("2");
button2.setFont(f1);
button2.setBackground(Color.CYAN);
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 2";
} else {
expression += "2";
}
textField.append("2");
}else if("".equals(temp)){
textField.append("2");
expression += "2";
}
}
});
button3 = new JButton("3");
button3.setFont(f1);
button3.setBackground(Color.CYAN);
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 3";
} else {
expression += "3";
}
textField.append("3");
}else if("".equals(temp)){
textField.append("3");
expression += "3";
}
}
});
button4 = new JButton("4");
button4.setFont(f1);
button4.setBackground(Color.CYAN);
button4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 4";
} else {
expression += "4";
}
textField.append("4");
}else if("".equals(temp)){
textField.append("4");
expression += "4";
}
}
});
button5 = new JButton("5");
button5.setFont(f1);
button5.setBackground(Color.CYAN);
button5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 5";
} else {
expression += "5";
}
textField.append("5");
}else if("".equals(temp)){
textField.append("5");
expression += "5";
}
}
});
button6 = new JButton("6");
button6.setFont(f1);
button6.setBackground(Color.CYAN);
button6.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 6";
} else {
expression += "6";
}
textField.append("6");
}else if("".equals(temp)){
textField.append("6");
expression += "6";
}
}
});
button7 = new JButton("7");
button7.setFont(f1);
button7.setBackground(Color.CYAN);
button7.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 7";
} else {
expression += "7";
}
textField.append("7");
}else if("".equals(temp)){
textField.append("7");
expression += "7";
}
}
});
button8 = new JButton("8");
button8.setFont(f1);
button8.setBackground(Color.CYAN);
button8.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 8";
} else {
expression += "8";
}
textField.append("8");
}else if("".equals(temp)){
textField.append("8");
expression += "8";
}
}
});
button9 = new JButton("9");
button9.setFont(f1);
button9.setBackground(Color.CYAN);
button9.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 9";
} else {
expression += "9";
}
textField.append("9");
}else if("".equals(temp)){
textField.append("9");
expression += "9";
}
}
});
button0 = new JButton("0");
button0.setFont(f1);
button0.setBackground(Color.CYAN);
button0.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (')' == last) {
expression += "* 0";
} else {
expression += "0";
}
textField.append("0");
}else if("".equals(temp)){
textField.append("0");
expression += "0";
}
}
});
buttonAdd = new JButton("+");
buttonAdd.setFont(f1);
buttonAdd.setBackground(Color.CYAN);
buttonAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/'|| last == '(') {
} else {
textField.append("+");
expression += " + ";
}
}
}
});
buttonSub = new JButton("-");
buttonSub.setFont(f1);
buttonSub.setBackground(Color.CYAN);
buttonSub.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/'|| last == '(') {
} else {
textField.append("-");
expression += " - ";
}
}
}
});
buttonMul = new JButton("*");
buttonMul.setFont(f1);
buttonMul.setBackground(Color.CYAN);
buttonMul.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/'|| last == '(') {
} else {
textField.append("*");
expression += " * ";
}
}
}
});
buttonDiv = new JButton("/");
buttonDiv.setFont(f1);
buttonDiv.setBackground(Color.CYAN);
buttonDiv.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/'|| last == '(') {
} else {
textField.append("/");
expression += " / ";
}
}
}
});
buttonDel = new JButton("DEL");
buttonDel.setFont(f1);
buttonDel.setBackground(Color.CYAN);
buttonDel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String first = textField.getText();
if (first!=null&&!"".equals(first)) {
int length = first.length();
textField.setText(first.substring(0, length - 1));
}
}
});
buttonCle = new JButton("CLE");
buttonCle.setFont(f1);
buttonCle.setBackground(Color.CYAN);
buttonCle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textField.setText("");
}
});
buttonPoi = new JButton(".");
buttonPoi.setFont(f1);
buttonPoi.setBackground(Color.CYAN);
buttonPoi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '0' || last == '1' || last == '2' || last == '3' || last == '4' || last == '5'
|| last == '6' || last == '7' || last == '8' || last == '9') {
textField.append(".");
expression += ".";
}
}else if("".equals(temp)) {
textField.append(".");
expression += "0.";
}
}
});
buttonRes = new JButton("=");
buttonRes.setFont(f1);
buttonRes.setBackground(Color.CYAN);
buttonRes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//TODO:判断括号是否匹配
System.out.println(expression);
float result = new Counter().calInfix(expression);
textField.setText(""+result);
expression="";
}
});
buttonRes.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
textField.setText("");
}
@Override
public void focusGained(FocusEvent e) {
}
});
buttonRig = new JButton(")");
buttonRig.setFont(f1);
buttonRig.setBackground(Color.CYAN);
buttonRig.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/') {
} else {
textField.append(")");
expression += " ) ";
}
}
}
});
buttonLef = new JButton("(");
buttonLef.setFont(f1);
buttonLef.setBackground(Color.CYAN);
buttonLef.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = textField.getText().trim();
if (temp!=null&&!"".equals(temp)) {
char last = temp.charAt(temp.length() - 1);
if (last == '+' || last == '-' || last == '*' || last == '/') {
textField.append("(");
expression += "( ";
} else if(last == '0'||last == '1'||last == '2'||last == '3'||last == '4'||last == '5'||last == '6'||last == '7'||last == '8'||last == '9'){
textField.append("(");
expression += " * ( ";
} else {
}
}else if("".equals(temp)) {
textField.append("(");
expression += "( ";
}
}
});
centerPanel.add(button7);
centerPanel.add(button8);
centerPanel.add(button9);
centerPanel.add(buttonAdd);
centerPanel.add(buttonRig);
centerPanel.add(button4);
centerPanel.add(button5);
centerPanel.add(button6);
centerPanel.add(buttonSub);
centerPanel.add(buttonLef);
centerPanel.add(button1);
centerPanel.add(button2);
centerPanel.add(button3);
centerPanel.add(buttonMul);
centerPanel.add(buttonDel);
centerPanel.add(button0);
centerPanel.add(buttonPoi);
centerPanel.add(buttonRes);
centerPanel.add(buttonDiv);
centerPanel.add(buttonCle);
getContentPane().add(topPanel);
getContentPane().add(centerPanel);
setVisible(true);
}