帮我用java语言写一个可以将任意二元运算符的算术表达式转化为后缀表达式的计算器,要求有GUI界面
时间: 2024-03-10 08:44:16 浏览: 65
好的,我可以为您提供一个基于Java语言的计算器程序,它可以将任意二元运算符的算术表达式转换为后缀表达式,并且带有GUI界面。下面是示例代码:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener {
private JTextField inputField;
private JTextField outputField;
private JButton calculateButton;
public Calculator() {
super("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
inputField = new JTextField(20);
outputField = new JTextField(20);
outputField.setEditable(false);
calculateButton = new JButton("Calculate");
calculateButton.addActionListener(this);
add(inputField);
add(calculateButton);
add(outputField);
pack();
setVisible(true);
}
private boolean isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
private int priority(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
private String toPostfix(String infix) {
StringBuilder postfix = new StringBuilder();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < infix.length(); i++) {
char c = infix.charAt(i);
if (Character.isDigit(c)) {
postfix.append(c);
} else if (isOperator(c)) {
while (!stack.empty() && priority(stack.peek()) >= priority(c)) {
postfix.append(stack.pop());
}
stack.push(c);
} else if (c == '(') {
stack.push(c);
} else if (c == ')') {
while (!stack.empty() && stack.peek() != '(') {
postfix.append(stack.pop());
}
stack.pop();
}
}
while (!stack.empty()) {
postfix.append(stack.pop());
}
return postfix.toString();
}
public void actionPerformed(ActionEvent event) {
String input = inputField.getText();
String postfix = toPostfix(input);
outputField.setText(postfix);
}
public static void main(String[] args) {
new Calculator();
}
}
```
这个程序实现了一个简单的计算器,它可以将输入的中缀表达式转换为后缀表达式,并将结果输出到界面上。
计算器的核心算法是 `toPostfix` 方法,它使用栈来实现中缀表达式转换为后缀表达式的过程。具体来说,算法的流程如下:
1. 遍历输入的中缀表达式。
2. 如果是数字,则将其添加到后缀表达式中。
3. 如果是运算符,则将其与栈顶的运算符进行比较,如果栈顶的运算符优先级不低于当前运算符,则将栈顶的运算符弹出并添加到后缀表达式中,重复此过程直到栈顶的运算符优先级低于当前运算符或栈为空,然后将当前运算符压入栈中。
4. 如果是左括号,则将其压入栈中。
5. 如果是右括号,则将栈顶的运算符弹出并添加到后缀表达式中,直到遇到左括号为止,左括号弹出但不添加到后缀表达式中。
6. 遍历完中缀表达式后,将栈中剩余的运算符全部弹出并添加到后缀表达式中。
在 `actionPerformed` 方法中,我们调用 `toPostfix` 方法将输入的中缀表达式转换为后缀表达式,并将结果输出到界面上。
您可以根据需要修改此代码以满足您的要求。
阅读全文