数据结构_栈和队列
原创2019/1/2大约 3 分钟
前言
本文介绍栈、队列两种抽象数据类型。
栈
栈stack,又称堆栈,是一种抽象数据类型,每次只能访问栈顶元素top,可以进行压入push和推出pop操作。其元素先进后出 (FILO)。
队列
队列queue,是和栈相对的一种抽象数据类型,每次从后端rear插入,从前端front删除。其元素先进先出 (FIFO)。
用链表实现的队列可以自由扩充,不存在伪溢出问题,但是插入和读取比较耗时;
用数组实现的队列大小固定,可以使用循环队列解决伪溢出问题,即当尾端(前端也类似)指针指向超出数组大小时,可以指向数组开始位置,因为此时大小不超过数组的队列前端已经指向 0 之后的位置了,所以不会冲突。
优先级队列
和队列定义一致,只是在每次插入的时候都进行排序,以满足排序规则(如尾端→前端 小→大)。
中缀表达式与后缀表达式
中缀表达式,指运算符在操作数中间的,如1 + 2。
后缀表达式,指运算符在操作数后面的,如1 2 +。
中缀表达式 ↔ 后缀表达式:
中缀表达式:1 + 2 * ( 3 + 5 ) - 2 * 3 - 9 / 2
后缀表达式:1 2 3 5 + * + 2 3 * - 9 2 / -转换规则:
设一个栈用于保存运算符,从左到右依次遍历中缀表达式,假设读取到的是x
如果是操作数,则直接打印
如果是运算符
(,则压入栈中如果是运算符
),则推出栈中的元素,直到遇到(,推出(,继续读取下一个否则,读取栈顶元素
top,如果是(,将x压入栈中;如果
x优先于top,将x压入栈中;否则,将
top推出,在此和新的top比较,直到遇到top是(或者优先级比x高,或者栈已经空了,将x插入栈中。
/**
 * 中缀表达式转化为后缀表达式
 * @param infix 中缀表达式 1+2
 * @return 后缀表达式 1 2 +
 */
public static String[] covertInfixToPostfix(String infix) {
    StringBuilder stringBuilder = new StringBuilder();
    OperatorStack operatorStack = new OperatorStack();
    for (char item : infix.toCharArray()) {
        // 数字
        if (item >= '0' && item <= '9') {
            stringBuilder.append(item + ",");
        } else if (item == '(') {
            operatorStack.insert(item);
        } else if (item == ')') {
            int size = operatorStack.size();
            for (int i = 0; i < size; i++) {
                try {
                    char pop = operatorStack.pop();
                    if (pop == '(') {
                        break;
                    } else {
                        stringBuilder.append(pop + ",");
                    }
                } catch (Exception e) {
                    System.out.println("栈为空");
                }
            }
        } else {
            try {
                char peek = operatorStack.peek();
                if (peek == '(') {
                    operatorStack.insert(item);
                } else if (isPre(item, peek) > 0) {
                    operatorStack.insert(item);
                } else {
                    int size = operatorStack.size();
                    for (int i = 0; i < size; i++) {
                        try {
                            char pop = operatorStack.peek();
                            if (pop == '(') {
                                break;
                            } else if (isPre(item, peek) > 0) {
                                break;
                            } else {
                                stringBuilder.append(pop + ",");
                                operatorStack.pop();
                            }
                        } catch (Exception e) {
                            break;
                        }
                    }
                    operatorStack.insert(item);
                }
            } catch (Exception e) {
                System.err.println("栈为空");
                operatorStack.insert(item);
            }
        }
    }
    int size = operatorStack.size();
    for (int i = 0; i < size; i++) {
        try {
            stringBuilder.append(operatorStack.pop() + ",");
        } catch (Exception e) {
            System.out.println("栈为空");
            break;
        }
    }
    String result = stringBuilder.toString();
    return result.split(",");
}源码
👉点这里查看中缀表达式 → 后缀表达式源码
