最近在复习数据结构,就用栈实现了一个简单计算器,增加了AWT的图形界面.
例:输入一个字符串:3*2+1-2
解题思路:
定义两个栈,一个用来存放数字,另一个用来存放操作符.
遍历字符串,如果是数字,就放入数字栈,
如果是操作符,则分两种情况:
- 1.若字符栈为空,则直接入栈
- 2.字符栈不为空,需要比较当前要入栈的字符和字符栈顶的字符的优先级
- 如果前者优先级小于后者, 则需要进行计算(从数字栈取两个值,字符栈取一个值进行计算) ,计算完成之后将结果入数字栈, 再继续判断要入栈的字符和字符栈顶的字符的优先级.
- 如果前者优先级大于后者, 当前字符入字符栈, 记录一个标志位, 下一个数字入栈之后进行计算.(从数字栈取两个值,字符栈取一个值进行计算).
如何判断计算完:
- 字符栈为空
最后全部计算完之后,将结果入数字栈,返回该结果即可.
附上代码:
import java.awt.*;
import java.awt.event.*;
import java.util.Stack;
public class Calculator {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame {
Button btn0,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,add,min,mul,div,equal,clear,delete;
TextField tx;
public MyFrame() {
/**
* 1.添加按钮 文本框
* 2.添加事件监听
*/
//添加组件 10个数字 5个运算符 一个文本框 一个清零按钮 一个删除按钮
btn0 = new Button("0");
btn1 = new Button("1");
btn2 = new Button("2");
btn3 = new Button("3");
btn4 = new Button("4");
btn5 = new Button("5");
btn6 = new Button("6");
btn7 = new Button("7");
btn8 = new Button("8");
btn9 = new Button("9");
add = new Button("+");
min = new Button("-");
mul = new Button("*");
div = new Button("/");
equal = new Button("=");
clear = new Button("clear");
delete = new Button("<-");
tx = new TextField("");
//添加一个面板
Panel panel = new Panel();
//设置面板布局
panel.setLayout(new GridLayout(5,3));
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);
panel.add(btn5);
panel.add(btn6);
panel.add(btn7);
panel.add(btn8)