数据结构栈的应用 java实现计算器的加减乘除以及括号

实现一个基本的计算器来计算一个简单的字符串表达式的值。

示例 :
输入: “6+5/3-2*2”
输出: 3
因为乘除的优先级大于加减,我们现实现加减运算
我们使用数据结构栈Stack,是先进后出,有进栈和出栈两种

方法一般用到的有如下的方法:
IsEmpty() //判断是否为满
bool IsFull() //判断是否为空
pop(); //出栈并获得栈顶值
int push(const T& data); //进栈
getPop() 获得栈顶元素值
clear() //清空栈

首先解决的问题是:
字符123 如何转化为数字123
依次读取每个字符
110+2
12
10+3
num = num*10+(a-‘0’);

例如计算6-3+2我们放入栈中就是
+6 <--------指针
-3
+2
6+(-3)+2
然后依次取出栈中的数经行相加,就可以得到结果:

具体代码如下:

class Solution {
    public int calculate(String s) {
        s = s.replace(" ","");
        Stack<Integer> stk  = new Stack();
        int num = 0;
        char fu = '+';
        设初始的符号为+,表示正数,
        for(int i =0;i<s.length();i++){
            char a = s.charAt(i);
            if(isnumber(a)){
                num = num*10+(a-'0');
            }
            if(!isnumber(a)||i==s.length()-1){
                int p;
                switch(fu){
                    case '+': stk.push(num); break;
                    case '-': stk.push(-num); break;
                    case '/': p= stk.pop();
                    //取出栈顶的值,并移除栈顶的值
                              stk.push(p/num);break;
                    case '*':  p= stk.pop();
                       stk.push(p*num);
                       break;
                  }
                  fu = a;
                  //把数放入栈中,同时将符号改变,这里是理解的关键
                  num =0;
            }
        }
            int result = 0;
            //运用while()循环,获得结果
            while(!stk.isEmpty()){
               result += stk.pop();
            }
       return result;
 
    }
    //判断是否为数字的方法
    也可以使用
    Character.isDigit(ch)
    
    public boolean isnumber(char s) {
        boolean right = false;
        if(s>='0'&&s<='9'){
            right = true;
        }
        return right;
    }
}

计算加减以及括号的运算

输入: “(6-3)+(6+8)”
输出: 17

    class Solution {
    public int calculate(String s) {
    Stack<Integer> stack = new Stack();
    int fuhao = 1;
    int sum = 0;
    int num = 0;
    for(int i = 0;i<s.length();i++){
        char ch = s.charAt(i);
        if(Character.isDigit(ch)){
            num = 10*num + (int)(ch-'0');
        }
        else if(ch=='+') {
            sum += fuhao*num;
            fuhao = 1;
            num = 0;
        } else if(ch=='-') {
            sum +=fuhao*num;
            fuhao = -1;
            num = 0;

        } else if(ch=='(') {
            stack.push(sum);
            stack.push(fuhao);
            fuhao = 1;
            sum = 0;
        } else if(ch==')') {
            sum+=fuhao*num;
            sum *=stack.pop();
            sum+=stack.pop();
            num  = 0;
        }
    }
    return sum+fuhao*num;
    }
}

原创文章 8 获赞 14 访问量 594

猜你喜欢

转载自blog.csdn.net/weixin_43950187/article/details/105992052