用栈实现算术表达式 java_java的栈和用栈来解析算术表达式

446375

废话不多说,直接上代码, 栈是最简单的数据及结构, 可以使用数组实现也可以用链表实现. 并且有对泛型的支持.接口点击(此处)折叠或打开public interface StackE> {    boolean isEmpty();    E peek();    E pop();    void push(E item);    int size();}这是个用链表实现的stack.点击(此处)折叠或打开public class GenericLinkedStackE> implements StackE> {        private class NodeT>{        private T data;        private NodeT> next;                            private Node(T data,NodeT> next){            this.data=data;            this.next=next;        }    }    private NodeE> top;    private int size;        public void push(E item){        top=new Node(item, top);        size++;    }        public E pop(){        E result=top.data;        top=top.next;        size--;        return result;    }        public int size(){        return size;    }        public E peek(){        return top.data;    }        public boolean isEmpty(){        return size==0;    }        public static void main(String[] args) {        // TODO Auto-generated method stub        StackInteger> s = new GenericLinkedStack>();        System.out.println(s.isEmpty());        for(int i=0;i5;i++){            s.push(i);        }        for(int i=0;i10;i++){            s.push(i);        }        System.out.println(s.isEmpty());        System.out.println(s.peek());        System.out.println(s.size());        System.out.println(s.pop());                StackDouble> d= new GenericLinkedStack>();        System.out.println(d.isEmpty());        Random gen = new Random();                for(int i=0;i10;i++){            d.push(gen.nextGaussian());        }        System.out.println(d.isEmpty());        System.out.println(d.peek());        System.out.println(d.size());        System.out.println(d.pop());    }}下面的是数组的.点击(此处)折叠或打开public class GenericArrayStackE> implements StackE>{    private int top=-1;    private E[] data;    private static final int DEFAULT_CAPACITY=10;        public boolean isEmpty(){        return top==-1;    }        public int size(){        return data.length;    }        //constructor    public GenericArrayStack(){        data=(E[])new Object[DEFAULT_CAPACITY];    }        public E peek(){        return data[top];    }        public void push(E elem){        if(top==data.length-1)            resize(2*data.length);        data[++top]=elem;    }        public E pop(){        if(isEmpty()) throw new EmptyStackException();        return data[top--];    }        public void resize(int newCapacity){        E[] newdata = (E[])new Object[newCapacity];        for(int i=0;i=top;i++){            newdata[i]=data[i];        }        data=newdata;    }            public static void main(String[] args) {        // TODO Auto-generated method stub        StackInteger> s = new GenericArrayStack>();        System.out.println(s.isEmpty());                for(int i=0;i10;i++){            s.push(i);        }        System.out.println(s.isEmpty());        System.out.println(s.peek());        System.out.println(s.size());        System.out.println(s.pop());    }}下面是解析算术表达式点击(此处)折叠或打开package tree;public class Expression {    private static int rank(String op){        switch(op){        case "*":        case "/":            return 2;        case "+":        case "-":            return 1;        default :            return -1;        }    }        private static final String SPACE=" ";        public static String toPostfix(String expr){        StringBuilder result = new StringBuilder();        StackString> operators = new GenericArrayStack>();        for(String token: expr.split("\\s+")){            if(rank(token) > 0){                while(!operators.isEmpty() &&                     rank(operators.peek()) >= rank(token)){                    result.append(operators.pop()+SPACE);                    }                operators.push(token);            }else{                result.append(token+SPACE);            }        }        while(!operators.isEmpty()){            result.append(operators.pop()+SPACE);        }        return result.toString();        }        public static int compute(int i1, int i2, String op){        int result=0;        switch(op){            case "*":                 result = i1 * i2;                break;            case "/":                result = i1 / i2;                break;            case "+":                result = i1 + i2;                break;            case "-":                result = i1 - i2;                break;        }        return result;    }        public static int evalPostfix(String exp){        //Stack results = new GenericArrayStack();        StackString> operands = new GenericArrayStack>();        int result =0;        for(String token: exp.split("\\s+")){            if(rank(token)> 0){                int oper2=Integer.parseInt(operands.pop());                int oper1=Integer.parseInt(operands.pop());                result = compute(oper1, oper2, token);                 //System.out.println(result);                operands.push(Integer.toString(result,10));            }else{                operands.push(token);            }        }        return Integer.parseInt(operands.pop());    }        public static void main(String[] args) {        // TODO Auto-generated method stub        int answer =0;        String exp = "3 5 1 - *";        answer = evalPostfix("3 5 1 - *");        System.out.println(answer);                String exp2= "5 - 1 + 3 * 2";        System.out.println(evalPostfix(toPostfix(exp2)));    }}

10-12 11:23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值