数据结构-栈

后进先出

1. 顺序栈

  1. 定义栈顶top,初始值为-1
  2. 入栈:stack[++top] = data
  3. 出栈:return stack[top–]
  4. 栈空:top == -1
  5. 栈满:top == capacity - 1
public class MyStack<E> {
   
    // 栈的最大容量
    private int capacity;
    // 采用数组实现栈
    private E[] stack;
    // 栈顶索引
    private int top = -1;

    public MyStack(int capacity) {
   
        this.capacity = capacity;
        stack = (E[]) new Object[capacity];
    }

    public boolean empty() {
   
        return top == -1;
    }

    public boolean full() {
   
        return top == capacity - 1;
    }

    public int size() {
   
        return top + 1;
    }

    public E push(E item) {
   
        if (full()) {
   
            throw new RuntimeException("full");
        }
        // 先将top++,在赋值
        stack[++top] = item;
        return item;
    }

    public E pop() {
   
        if (empty()) {
   
            throw new RuntimeException("empty");
        }
        // 先获取栈顶值,再将top--
        return stack[top--];
    }

    public E peek() {
   
        if (empty()) {
   
            throw new RuntimeException("empty");
        }
        return stack[top];
    }
}

2. 中缀表达式

利用栈计算中缀表达式结果思路:

  1. 从左至右遍历中缀表达式,依次取出表达式的每一个字符
  2. 若取出的字符是运算符:
    1. 如果符号栈为空,直接入符号栈
    2. 如果符号栈不为空,判断当前操作符与栈顶操作符的优先级
      1. 当前操作符优先级小于或等于栈顶操作符:计算,然后将当前操作符压入符号栈
      2. 当前操作符优先级大于栈中的操作符,直接入符号栈
  3. 若取出的字符是操作数:分析出完整的运算数
    1. 如果当前已经是最后一位,则入栈
    2. 如果下一个字符是符号,则入栈
  4. 计算,直到符号栈为空
  5. 最后数字栈中仅剩的数字就是表达式结果
  • 计算过程:
    1. 从数字栈pop出两个数
    2. 从符号栈顶pop出一个符号
    3. 计算,将运算结果压入数字栈

中缀表达式代码实现:

import java.util.Stack;

public class Calculator {
   
    // 获取符号优先级
    public static int priority(char operation) {
   
        if (operation == '*' || operation == '/')
            return 1;
        else if (operation == '+' || operation == '-')
            return 0;
        else
            return -1;
    }

    // 判断字符是否为符号
    public static boolean isOperation(char value) {
   
        return value == '+' || value == '-' || value == '*' || value == 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值