Java简单计算器(栈实现)

本文介绍了使用栈数据结构实现一个简单计算器的过程,包括解析输入字符串、处理数字和操作符、根据优先级进行计算的逻辑,并提供了运行结果。通过AWT创建了图形用户界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在复习数据结构,就用栈实现了一个简单计算器,增加了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)
Java中,我们可以使用数组或者ArrayList等数据结构来创建一个简单计算器。这里是一个基本的步骤: 1. **创建Stack类** 或者使用`java.util.Stack`类:如果你想要自定义功能,可以创建一个名为CalculatorStack的类,继承自`java.util.Stack`,并在其中添加一些特定于计算器的操作。 ```java import java.util.Stack; public class CalculatorStack { private Stack<Integer> numbers; private Stack<Character> operators; // 构造函数、push方法(入)、pop方法(出)、peek方法(查看顶元素)等 } ``` 2. **操作方法**:你需要添加方法来处理数字和运算符的推入和弹出。例如,`pushNumber(int num)`用于将数字压入数字,`pushOperator(char op)`用于将运算符压入运算符。 3. **处理运算**:当你遇到运算符时(比如从输入读取到一个`+`或`-`),你可以暂时停止处理数字,直到遇到另一个运算符或计算结束。这时,你可以从运算符中取出最近的两个运算数和运算符,并进行相应的计算,然后把结果和新的运算符再压回里。 4. **处理结束标记**:当遇到一个表示计算结束的运算符(如`.`或`;`)或者到达底时,开始从顶执行剩余的运算。 这是一个基础的例子,实际应用中可能还需要考虑错误处理和用户输入验证等问题。下面是使用实现加法和减法的一般步骤: ```java // 示例使用 CalculatorStack stack = new CalculatorStack(); stack.pushNumber(5); // 5 stack.pushNumber(7); // 5 + 7 stack.pushOperator('+'); // 等待另一个数字或运算符 if (stack.peek() == '+') { // 如果是+ int result = stack.popNumber() + stack.popNumber(); // 计算并移除顶的两个数字 stack.pushNumber(result); } // 更多操作... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值