利用栈求解逆波兰表达式(后缀表达式)的值

什么是逆波兰表达式?

波兰表达式又叫做后缀表达式,是把运算量写在前面,把运算符写在后面。

中缀表达式如何转换为逆波兰表达式:

转换规则
转换的具体描述


转换示例

1、定义一个栈,用来存储操作数,在上一章节已经写了 https://www.jianshu.com/p/8e18d75c23a2 ;

2、从左到右遍历逆波兰表达式,得到每一个元素;

3、判断当前元素是运算符还是操作数;

4、如果是运算符,从栈中弹出两个操作数,完成运算,运算玩的结果再压入栈中;

5、操作数,把该操作数放入到栈中;

6、栈中最后一个元素,就是逆波兰表达式的结果,即是运算后的结果;


思路

此思路借鉴了white code 的文章:https://blog.csdn.net/qq_43751200/article/details/104619611

逆波兰表达式计算代码如下:

public class StackCalculate {

public static int calculate(String[] expression)throws Throwable {

if (expression ==null) {

throw new Throwable("Expression is null");

        }

if (expression.length ==0) {

return 0;

        }

LinkStack stack =new LinkStack();

        Integer pop1;

        Integer pop2;

        Integer result;

        for (int i =0; i < expression.length; i++) {

switch (expression[i]) {

case "+":

pop1 = stack.pop();

                    pop2 = stack.pop();

                    result = pop1 + pop2;

                    stack.push(result);

break;

                case "-":

pop1 = stack.pop();

                    pop2 = stack.pop();

                    //按照压栈和出栈的顺序,比如:压栈顺序为 17 5,那么5就在栈顶,17在栈底。

                    result = pop2 - pop1;//所以此处为pop2-pop1

                    stack.push(result);

break;

                case "*":

pop1 = stack.pop();

                    pop2 = stack.pop();

                    result = pop1 * pop2;

                    stack.push(result);

break;

                case "/":

pop1 = stack.pop();

                    pop2 = stack.pop();

                    //按照压栈和出栈的顺序,比如:压栈顺序为 17 5,那么5就在栈顶,17在栈底。

                    result = pop2 / pop1;//遇到除号,栈底的数除以栈顶的数

                    stack.push(result);

break;

                default:

stack.push(Integer.valueOf(expression[i]));

            }

}

return stack.pop();

    }

}

LinkStack的代码如下:

/**

* 栈的特性:数据的插入和删除只能在栈顶操作

*

* @param <T>

*/

public class LinkStack {

public LinkStack(int size) {

this.size = size;

    }

public LinkStack() {

this(DEFAULT_SIZE);

    }

private Linktop;

    private int size;

    private static final int DEFAULT_SIZE =0;

    /**

    * 数据存储的节点

    */

    class Link {

T data;

        Linknext;

        public Link(T data, Link next) {

this.data = data;

            this.next = next;

        }

}

/**

    * 入栈操作

    *

    * @param data

    */

    public void push(T data) {

Link head =top;

        Link newTop =new Link(data, head);//这句已经表明指向了top,就没必要newTop.next = top

        top = newTop;//是newTop成为栈顶

        size++;

    }

/**

    * 出栈操作

    *

    * @return

    */

    public T pop() {

if (top !=null) {

Link head =top;

            top =top.next;

            T t = head.data;

            head =null;

            size--;

            return t;

        }

return null;

    }

/**

    * 获取栈的长度

    *

    * @return

    */

    public int getSize() {

return size;

    }

/**

    * 判断栈是否为空

    *

    * @return

    */

    public boolean isEmpty() {

return size ==0;

    }

@Override

    public StringtoString() {

Link link =top;

        for (int i =0; i

System.out.print(link.data +"  ");

            link = link.next;

        }

System.out.println("  ");

        return "LinkStack{" +

"top=" +top +

", size=" +size +

'}';

    }

}

测试的运行结果如下:

再次感谢white code 所提供的的思路!https://blog.csdn.net/qq_43751200/article/details/104619611

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并...
    Aska小强阅读 278评论 0 0
  • 1. 栈 Stack 1.1 栈的特点 栈是一种线性结构 只能从一端添加元素,也只能从同一端(栈顶)取出元素 后进...
    xkzhai阅读 251评论 0 0
  • 概念: 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈...
    Yuge_8ba8阅读 520评论 0 0
  • 栈 定义 栈是一种“操作受限”的线性表,只允许在一端插入(入栈push)和删除(出栈pop)数据。 栈既可以用数组...
    竹blue阅读 285评论 0 0
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 2,203评论 0 3