用java实现栈,并且利用栈的特性计算中缀表达式(待加入括号)

什么是栈?

简单讲就是先进后出,吃进去吐出来,可以用链表实现,也可以用数组实现

我们来看看jdk1.8中栈的源码

public
class Stack<E> extends Vector<E> {
   
    /**
     * Creates an empty Stack.
     */
    public Stack() {
   
    }

 
    public E push(E item) {
   
        addElement(item);

        return item;
    }

  
    public synchronized E pop() {
   
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

    
    public synchronized E peek() {
   
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

   
    public boolean empty() {
   
        return size() == 0;
    }

    
    public synchronized int search(Object o) {
   
        int i = lastIndexOf(o);

        if (i >= 0) {
   
            return size() - i;
        }
        return -1;
    }

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;
}

可以看出,它是继承Vertor,并且封装了自己特有的的几个方法

自定义栈实现中缀表达式计算

一共包含四个类,第一个是栈的操作,第二第三个是和操作相关

大概的算法思想

0.创建数字栈和符号栈
1.创建index用来循环扫描expression
2.如果E[index]是数字,直接入数栈
3.若E[index]是符号,
    1)如果当前的符号栈为空,入符号栈
    2)如果当前符号栈不为空,进行比较
        1)如果当前操作符优先级《=OperStack栈顶的操作符
           就从numStack中pop两个数,从符号栈中pop一个operator,进行运算,将运算结果进numStack,再把当前operator进operStack。
        2)如果 > operStack[top],直接入operStack.
4.如果栈中最后只有一个数字,那就是结果

ArrayStack .java 包含了栈的相关操作


/**
 * @author Administrator
 * @date 2019/6/14/14:05
 */

public class ArrayStack {
   
    /**
     * 栈的最大容量
     */
    private int maxSize;
    /**
     * 用数组模拟栈
     */
    private int[] stack;
    /**
     * 栈顶指针,初始位置为-1
     */
    int top = -1;

    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
思路: 1. 定义两个,一个用于存储运算符,一个用于存储操作数; 2. 从左到右遍历中缀表达式中的每个字符; 3. 如果当前字符是数字,则直接压入操作数; 4. 如果当前字符是左括号,则直接压入运算符; 5. 如果当前字符是右括号,则不断弹出运算符中的元素,直到遇到左括号为止,将弹出的运算符与对应的操作数进行计算,将计算结果压入操作数; 6. 如果当前字符是运算符,则不断弹出运算符中优先级大于等于当前运算符的元素,将弹出的运算符与对应的操作数进行计算,将计算结果压入操作数,最后将当前运算符压入运算符; 7. 遍历完成后,依次弹出运算符中的元素,进行计算,直到运算符为空,最后操作数中剩下的元素即为表达式计算结果。 代码实现: ```java import java.util.*; public class InfixEvaluation { // 判断是否为运算符 private static boolean isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取运算符的优先级 private static int getPriority(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // 计算表达式 private static int evaluate(int a, int b, char operator) { switch (operator) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 中缀表达式求值 public static int evaluateInfix(String expression) { Stack<Integer> operands = new Stack<>(); // 操作数 Stack<Character> operators = new Stack<>(); // 运算符 for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (Character.isDigit(c)) { // 如果是数字,直接入 int num = c - '0'; while (i < expression.length() - 1 && Character.isDigit(expression.charAt(i + 1))) { num = num * 10 + expression.charAt(i + 1) - '0'; i++; } operands.push(num); } else if (c == '(') { // 如果是左括号,直接入 operators.push(c); } else if (c == ')') { // 如果是右括号,不断弹出运算符中的元素,直到遇到左括号为止 while (operators.peek() != '(') { char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } operators.pop(); // 弹出左括号 } else if (isOperator(c)) { // 如果是运算符 while (!operators.empty() && getPriority(operators.peek()) >= getPriority(c)) { char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } operators.push(c); } } while (!operators.empty()) { // 弹出运算符中的元素,进行计算 char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } return operands.pop(); // 返回操作数中的元素,即为表达式计算结果 } public static void main(String[] args) { String expression = "3+4*5-(6+7)*8/2"; int result = evaluateInfix(expression); System.out.println(expression + " = " + result); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值