zoukankan      html  css  js  c++  java
  • 算法之栈实现字符串运算

    用栈实现 3+2*6-2 思路图解 7*2*2-5+1-5+3-4
    定义两个栈,一个栈存数字,一个栈存运算符
    循环字符串中的每一位
    表达式扫描
    1. 如果是数字,直接入数栈
    2.如果是运算符,判断优先级
    若运算符>栈中的运算符,直接入栈
    若运算符<=栈中的运算符,符号栈pop一个符号栈,从数字栈pop两个数进行运算,将结果入数栈,然后运算符入符号栈

    表达工扫描完毕
    符号栈pop一个符号栈,从数字栈pop两个数进行运算,将结果入数栈

     验证分析过程:

    ----读取3,直接入数栈

    数字栈  3   

    ---读取+,数字栈为空,直接入栈

    此时栈内容为:数字栈  3   ====   符号栈 +

    ---读取2,,直接入数栈

    此时栈内容为:数字栈 2  3   ====  符号栈 +

    ---读取*,从符号栈取出(注意不是出栈)+进行比较,*优先级大于+,直接入栈

    此时栈内容为:数字栈 2  3   ====  符号栈 *  +

    ---读取6,直接入数栈

    此时栈内容为:数字栈 6 2  3   ====  符号栈 *  +

    ---读取-,从符号栈取出(注意不是出栈)*进行比较,-优先级小于*,从数字栈弹出两个值,从符号栈弱弹出一个运算符*进行运算,即6*2=12

    此时栈内容为:数字栈  3   ====  符号栈 +

    然后将运算结果入数字栈,并将运算符-入栈

    此时栈内容为:数字栈 12  3   ====  符号栈 -  +

    ---读取2,直接入数字栈

    此时栈内容为:数字栈 2 12  3   ====  符号栈 -  +

    至此  表达式读取完毕,接下来分别从数字栈弹出两个值2和12,从符号栈弱弹出一个运算符-进行运算,即12-2=10,并将运算结果入数字栈

    此时栈内容为:数字栈 10  3   ====  符号栈 +

    接下来分别从数字栈弹出两个值10和3,从符号栈弱弹出一个运算符 + 进行运算,即10+3=13,并将运算结果入数字栈

    此时数字栈内容为13,符号栈为空,运算结束

    代码如下:

    package azhong.stack;
    
    /**
     * 用栈实现 3+2*6-2 思路  7*2*2-5+1-5+3-4=28-14+4=18
     * 定义两个栈,一个栈存数字,一个栈存运算符
     * 循环字符串中的每一位
     * 表达式扫描
     * 1. 如果是数字,直接入数栈
     * 2.如果是运算符,判断优先级
     *     若运算符>栈中的运算符,直接入栈
     *     若运算符<=栈中的运算符,从符号栈弹出一个符号,从数字栈pop两个数进行运算,将结果入数栈,然后运算符入符号栈
     * 表达式扫描完毕
     * 符号栈pop一个符号栈,从数字栈pop两个数进行运算,将结果入数栈
     */
    public class StringComputeDemo {
        public static void main(String[] args) {
            StringComputer computer = new StringComputer();
            String str ="7*2*2-5+1-5+3-4";
            int result = computer.doString(str);
            System.out.println(str+"="+result);
        }
    }
    class StringComputer{
        NumberStack numberStack = new NumberStack(10);
        ComputeStack computeStack = new ComputeStack(10);
        public int  doString(String str){
            String[] strArr = str.split("");
            for(String s:strArr){
                if(isOperate(s)){
                    //是操作符
                    //System.out.println("操作符:"+s);
                    if(computeStack.top==-1){
                        //如果为空,直接入栈
                        computeStack.push(s);
                    }
                    else{
                        //从运算符栈中取出一个进行比较
                        String operateFromStack = computeStack.get();
                        int level_stack = getOperateLevel(operateFromStack);
                        int level = getOperateLevel(s);
                        //若运算符>栈中的运算符,直接入栈
                        if(level>level_stack){
                            computeStack.push(s);
                        }
                        else{
                            //从符号栈弹出一个符号,从数字栈pop两个数进行运算,将结果入数栈,然后运算符入符号栈
                            String strOperateFromStack =computeStack.pop();
                            int num1 =numberStack.pop();
                            int num2=numberStack.pop();
                            int n =compute(num1,num2,strOperateFromStack);
                            //运算结果入数栈
                            numberStack.push(n);
                            //操作符入符号栈
                            computeStack.push(s);
                        }
                    }
                }
                else{
                    //是数字
                    //System.out.println("数字:"+s);
                    int val = Integer.valueOf(s);
                    numberStack.push(val);
                }
            }
            //表达式扫描完毕 进行运算
            while (true){
                if(computeStack.isEmpty()){
                    break;
                }
                String operate =computeStack.pop();
                int n1 =numberStack.pop();
                int n2=numberStack.pop();
                int val =compute(n1,n2,operate);
                numberStack.push(val);
            }
            //运算完毕,取结果
            return numberStack.pop();
        }
    
        private int compute(int n1,int n2,String operate){
            if(operate.equals("+")){
                return n1+n2;
            }
            else if(operate.equals("-")){
                return n2-n1;
            }
            else if(operate.equals("*")){
                return n1*n2;
            }
            else if(operate.equals("/")){
                return n2/n1;
            }
            else{
                return 0;
            }
        }
    
        public boolean isOperate(String val){
            String str="+-*/";
            int i = str.indexOf(val);
            return i>=0;
        }
        public int getOperateLevel(String val){
            if("*/".indexOf(val)>=0){
                return 1;
            }
            else if("+-".indexOf(val)>=0){
                return 0;
            }
            else{
                return -1;
            }
        }
    }
    
    /**
     * 数值栈
     */
    class NumberStack{
        int [] arr;
        int size;
        int top;
        public NumberStack(int size){
            this.size=size;
            this.top=-1;
            arr = new int[size];
        }
        public void push(int val){
            if(!isFull()){
                top++;
                arr[top]=val;
    
            }
        }
        public int pop(){
            if(!isEmpty()){
                int val =arr[top];
                top--;
                return val;
            }
            return top;
        }
        private boolean isFull(){
            return top==size-1;
        }
        private boolean isEmpty(){
            return top==-1;
        }
    }
    
    /**
     * 运算符栈
     */
    class ComputeStack{
        String[] arr;
        int top;
        int size;
        public ComputeStack(int size){
            this.size=size;
            top=-1;
            arr = new String[size];
        }
        public void push(String val){
            if(!isFull()){
                top++;
                arr[top]=val;
    
            }
        }
        public String pop(){
            if(!isEmpty()){
                String val =arr[top];
                top--;
                return val;
            }
            return null;
        }
    
        public String get(){
            return arr[top];
        }
        private boolean isFull(){
            return top==size-1;
        }
        public boolean isEmpty(){
            return top==-1;
        }
    }
  • 相关阅读:
    EF实现增删改查
    托管代码与非托管代码的区别
    堆、栈以及队列
    C#装箱和拆箱
    Leecode刷题之旅-C语言/python-349两个数组的交集
    Leecode刷题之旅-C语言/python-344反转字符串
    Leecode刷题之旅-C语言/python-217存在重复元素
    Leecode刷题之旅-C语言/python-206反转链表
    Leecode刷题之旅-C语言/python-204计数质数
    Leecode刷题之旅-C语言/python-203移除链表元素
  • 原文地址:https://www.cnblogs.com/huangzhen22/p/14544086.html
Copyright © 2011-2022 走看看