在android studio中制作优先级从左到右运行的计算器
时间: 2023-12-31 07:44:57 浏览: 170
首先,你需要创建一个 UI 布局来放置你的计算器按钮。在布局中,你可以使用 GridLayout 或者 TableLayout 来放置按钮。接着,你需要编写 Java 代码来实现计算器的逻辑。
以下是一个简单的实现,它使用了 GridLayout 布局和一个 Stack 来处理运算符的优先级:
1. 创建一个 GridLayout 布局,并在其中添加按钮。可以使用 Button 控件或者 TextView 控件来实现按钮。
2. 创建一个 Stack 来存储数字和运算符。在用户点击数字或者运算符按钮时,将它们推入 Stack 中。
3. 如果用户点击了一个运算符按钮,检查 Stack 中的顶部元素。如果它是一个运算符并且该运算符的优先级高于当前运算符,则从 Stack 中弹出顶部元素,并将该运算符推入 Stack 中。重复此过程直到 Stack 为空或者顶部元素的优先级不高于当前运算符。
4. 如果用户点击了等号按钮,则从 Stack 中弹出所有元素并按照它们在 Stack 中的顺序进行计算。
以下是示例代码:
```
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private Stack<String> mStack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
mStack = new Stack<>();
GridLayout gridLayout = findViewById(R.id.grid_layout);
for (int i = 0; i < gridLayout.getChildCount(); i++) {
View view = gridLayout.getChildAt(i);
if (view instanceof Button) {
view.setOnClickListener(this);
}
}
}
@Override
public void onClick(View view) {
if (view instanceof Button) {
Button button = (Button) view;
String text = button.getText().toString();
switch (text) {
case "+":
case "-":
case "*":
case "/":
while (!mStack.empty() && isHigherPriority(mStack.peek(), text)) {
String operator = mStack.pop();
String right = mStack.pop();
String left = mStack.pop();
String result = calculate(left, operator, right);
mStack.push(result);
}
mStack.push(text);
break;
case "=":
while (mStack.size() > 1) {
String right = mStack.pop();
String operator = mStack.pop();
String left = mStack.pop();
String result = calculate(left, operator, right);
mStack.push(result);
}
mTextView.setText(mStack.pop());
break;
default:
mStack.push(text);
break;
}
}
}
private boolean isHigherPriority(String operator1, String operator2) {
return (operator1.equals("*") || operator1.equals("/")) &&
(operator2.equals("+") || operator2.equals("-"));
}
private String calculate(String left, String operator, String right) {
double leftValue = Double.parseDouble(left);
double rightValue = Double.parseDouble(right);
switch (operator) {
case "+":
return String.valueOf(leftValue + rightValue);
case "-":
return String.valueOf(leftValue - rightValue);
case "*":
return String.valueOf(leftValue * rightValue);
case "/":
return String.valueOf(leftValue / rightValue);
default:
return "";
}
}
}
```
在这个示例中,布局文件中包含了一个 GridLayout 和若干个 Button 控件。通过 findViewById 方法获取 GridLayout 和 TextView 控件,并将按钮的点击事件监听器设置为当前 Activity。在 onClick 方法中,根据用户点击的按钮类型进行相应的处理。如果用户点击了数字按钮,则将数字推入 Stack 中;如果用户点击了运算符按钮,则根据运算符的优先级进行处理;如果用户点击了等号按钮,则从 Stack 中弹出所有元素并进行计算,最后将结果显示在 TextView 中。
当用户点击运算符按钮时,如果当前运算符的优先级高于 Stack 中顶部元素的优先级,则将运算符推入 Stack 中;否则,从 Stack 中弹出顶部元素并进行计算,并将计算结果推入 Stack 中。这个过程重复执行直到 Stack 为空或者顶部元素的优先级不高于当前运算符。
阅读全文