Java中如何利用栈使用简易计算器

发布时间:2021-09-27 17:50 来源:亿速云 阅读:0 作者:小新 栏目: 开发技术 欢迎投稿:712375056

这篇文章主要为大家展示了“Java中如何利用栈使用简易计算器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中如何利用栈使用简易计算器”这篇文章吧。

题目:使用栈计算类似表达式:5+2*3-2 的计算结果

提示:简易计算器操作符号限于+,-,*,/的计算

分析思路:

1、创建一个数栈和一个符号栈,数栈用于存放数字,符号栈用于存放符号

2、创建一个索引index,用于遍历表达式

3、扫描表达式,如果是数字直接进入数栈,如果是符号,则需要进行判断。分两种情况,一是当符号栈如果为空,直接将符号入栈。二是不为空,先比较当前栈顶的符号与将要进栈的符号的优先级大小,如果将要进栈的操作符的优先级小,则将数栈的两个数弹出,符号栈的操作符弹出一个,并进行计算,计算之后的结果直接进入数栈,如果优先级大,就直接进栈。

4、扫描完表达式之后,就顺序的从数栈和符号栈顺序的弹出相应的数字和操作符,并进行计算。

5、当符号栈为空时,说明已经计算完了,此时留在数栈的只有一个数字,就是表达式计算之后的结果。

代码实现

package cn.mrlij.stack; import java.util.Arrays;import java.util.Scanner; /** * 使用数组实现栈 * * @author dreamer * */public class ArrayStackDemo {  public static void main(String[] args) {   String express = "5011+2*3-2";   int index = 0;//定义一个索引值,用于遍历表达式    int num1 = 0;    int num2 = 0;    int res = 0;//计算结果    char ch = ' ';    int oper = 0;    String keepNum = "";    ArrayStack numStack = new ArrayStack(10);//创建一个数栈    ArrayStack operStack = new ArrayStack(10);//创建一个符号栈    while (true){      ch = express.substring(index,index+1).charAt(0);//不停的遍历操作符      //判断是否是操作符      if (operStack.isOper(ch)){        //判断当前符号栈是否有符号存在        if(!operStack.isEmpty()){          //不为空则判断优先级          if(operStack.priority(ch)<=operStack.priority(operStack.peek())){            //当优先级小于栈顶的值时候,弹出两个数栈的值进行计算            num1 = numStack.pop();            num2 = numStack.pop();            oper = operStack.pop();            res = operStack.cal(num1,num2,oper);            //计算以后将计算得到的值放入数栈            numStack.push(res);            //同时将此时的操作符放入符号栈            operStack.push(ch);          }else{            //优先级            operStack.push(ch);          }        }else{          //为空直接将符号入栈          operStack.push(ch);        }      }else {        keepNum += ch;        //处理多位数        if(express.length()-1 == index){          numStack.push(Integer.parseInt(keepNum));        }else {          if(operStack.isOper(express.substring(index+1,index+2).charAt(0))){            numStack.push(Integer.parseInt(keepNum));            keepNum = "";          }        }        // numStack.push(ch-48);      }      index++;      if(index >= express.length()){        break;      }    }    //扫描完之后,将数栈的值,与操作符中的值进行计算    while (true){      if(operStack.isEmpty()){        break;      }      num1 = numStack.pop();      num2 = numStack.pop();      oper = operStack.pop();      res = operStack.cal(num1,num2,oper);      numStack.push(res);    }    System.out.println("表达式:"+express+"="+numStack.pop());  }} class ArrayStack {  private int MaxSize;// 定义数组的最大长度  private int[] arr;// 定义数组,数据就放在该数组  private int top = -1;// 定义栈顶,初始化数据为-1   public ArrayStack(int maxSize) {    this.MaxSize = maxSize;    arr = new int[MaxSize];  }   // 判断数组是否为空  public boolean isEmpty() {     return top == -1;  }   // 判断数组是否满了  public boolean isFull() {    //System.out.println("栈顶:" + top + "最大长度:" + MaxSize);    return top == MaxSize - 1;  }  //取出棧頂元素  public int peek(){    return arr[top];  }  // 进栈  public void push(int val) {    // 先判断栈是否满了,满了就不能添加进去    if (isFull()) {      System.out.println("栈已经满了~~");      return;    }    top++;    arr[top] = val;  }   // 出栈  public int pop() {    // 先判断栈是否为空    if (isEmpty()) {      throw new RuntimeException("栈为空,无法出栈!");    }    int val = arr[top];    top--;    return val;  }   public void show() {    if (isEmpty()) {      System.out.println("没有数据");      return;    }    for (int i = top; i >= 0; i--) {      System.out.print(arr[i] + "\t");    }    System.out.println();  }   /**   * 判断是否是一个操作符   * @param oper 传入的字符   * @return 如是操作符返回true,否则返回false   */  public boolean isOper(char oper){    return oper == '+' || oper == '-' || oper =='*' || oper == '/';  }   /**   * 判断操作符的优先级   * @param oper 传入的优先级   * @return 返回优先级 分别是1,-1,0   */  public int priority(int oper ){    if(oper == '*' || oper == '/'){      return 1;    } else if(oper == '+' || oper == '-'){      return 0;    }else {      return -1;    }  }   //计算方法  public int cal(int num1,int num2,int oper){    int res = 0;    switch (oper){      case '+': res = num1 + num2;      break;      case '-': res = num2 - num1;      break;      case '*': res = num1 * num2;      break;      case '/': res = num2 /num1;    }    return res;  }}

免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系我们QQ:712375056,同时欢迎投稿传递力量。