欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用棧使用簡易計算器(Java實(shí)現(xiàn))

 更新時間:2019年09月25日 15:06:53   作者:dreamer_it  
這篇文章主要為大家詳細(xì)介紹了Java利用棧實(shí)現(xiàn)簡易計算器,具有一定的參考價值,感興趣的小伙伴們可以參考一下

題目:使用棧計算類似表達(dá)式:5+2*3-2  的計算結(jié)果 

提示:簡易計算器操作符號限于+,-,*,/的計算

分析思路:

1、創(chuàng)建一個數(shù)棧和一個符號棧,數(shù)棧用于存放數(shù)字,符號棧用于存放符號

2、創(chuàng)建一個索引index,用于遍歷表達(dá)式

3、掃描表達(dá)式,如果是數(shù)字直接進(jìn)入數(shù)棧,如果是符號,則需要進(jìn)行判斷。分兩種情況,一是當(dāng)符號棧如果為空,直接將符號入棧。二是不為空,先比較當(dāng)前棧頂?shù)姆柵c將要進(jìn)棧的符號的優(yōu)先級大小,如果將要進(jìn)棧的操作符的優(yōu)先級小,則將數(shù)棧的兩個數(shù)彈出,符號棧的操作符彈出一個,并進(jìn)行計算,計算之后的結(jié)果直接進(jìn)入數(shù)棧,如果優(yōu)先級大,就直接進(jìn)棧。

4、掃描完表達(dá)式之后,就順序的從數(shù)棧和符號棧順序的彈出相應(yīng)的數(shù)字和操作符,并進(jìn)行計算。

5、當(dāng)符號棧為空時,說明已經(jīng)計算完了,此時留在數(shù)棧的只有一個數(shù)字,就是表達(dá)式計算之后的結(jié)果。

代碼實(shí)現(xiàn)

package cn.mrlij.stack;
 
import java.util.Arrays;
import java.util.Scanner;
 
/**
 * 使用數(shù)組實(shí)現(xiàn)棧
 *
 * @author dreamer
 *
 */
public class ArrayStackDemo {
  public static void main(String[] args) {
   String express = "5011+2*3-2";
   int index = 0;//定義一個索引值,用于遍歷表達(dá)式
    int num1 = 0;
    int num2 = 0;
    int res = 0;//計算結(jié)果
    char ch = ' ';
    int oper = 0;
    String keepNum = "";
    ArrayStack numStack = new ArrayStack(10);//創(chuàng)建一個數(shù)棧
    ArrayStack operStack = new ArrayStack(10);//創(chuàng)建一個符號棧
    while (true){
      ch = express.substring(index,index+1).charAt(0);//不停的遍歷操作符
      //判斷是否是操作符
      if (operStack.isOper(ch)){
        //判斷當(dāng)前符號棧是否有符號存在
        if(!operStack.isEmpty()){
          //不為空則判斷優(yōu)先級
          if(operStack.priority(ch)<=operStack.priority(operStack.peek())){
            //當(dāng)優(yōu)先級小于棧頂?shù)闹禃r候,彈出兩個數(shù)棧的值進(jìn)行計算
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            res = operStack.cal(num1,num2,oper);
            //計算以后將計算得到的值放入數(shù)棧
            numStack.push(res);
            //同時將此時的操作符放入符號棧
            operStack.push(ch);
          }else{
            //優(yōu)先級
            operStack.push(ch);
          }
        }else{
          //為空直接將符號入棧
          operStack.push(ch);
        }
      }else {
        keepNum += ch;
        //處理多位數(shù)
        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;
      }
    }
    //掃描完之后,將數(shù)棧的值,與操作符中的值進(jìn)行計算
    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("表達(dá)式:"+express+"="+numStack.pop());
  }
}
 
class ArrayStack {
  private int MaxSize;// 定義數(shù)組的最大長度
  private int[] arr;// 定義數(shù)組,數(shù)據(jù)就放在該數(shù)組
  private int top = -1;// 定義棧頂,初始化數(shù)據(jù)為-1
 
  public ArrayStack(int maxSize) {
    this.MaxSize = maxSize;
    arr = new int[MaxSize];
  }
 
  // 判斷數(shù)組是否為空
  public boolean isEmpty() {
 
    return top == -1;
  }
 
  // 判斷數(shù)組是否滿了
  public boolean isFull() {
    //System.out.println("棧頂:" + top + "最大長度:" + MaxSize);
    return top == MaxSize - 1;
  }
  //取出棧頂元素
  public int peek(){
    return arr[top];
  }
  // 進(jìn)棧
  public void push(int val) {
    // 先判斷棧是否滿了,滿了就不能添加進(jìn)去
    if (isFull()) {
      System.out.println("棧已經(jīng)滿了~~");
      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("沒有數(shù)據(jù)");
      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 == '/';
  }
 
  /**
   * 判斷操作符的優(yōu)先級
   * @param oper 傳入的優(yōu)先級
   * @return 返回優(yōu)先級 分別是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;
  }
}

 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中使用BeanMap將對象轉(zhuǎn)為Map詳解

    Java中使用BeanMap將對象轉(zhuǎn)為Map詳解

    這篇文章主要介紹了Java中使用BeanMap將對象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個類,BeanMap?可以將?Java?對象的屬性作為鍵,屬性值作為對應(yīng)的值,存儲在一個?Map?中,它提供了一種將?Java?對象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下
    2024-01-01
  • Java正則環(huán)視和反向引用功能與用法詳解

    Java正則環(huán)視和反向引用功能與用法詳解

    這篇文章主要介紹了Java正則環(huán)視和反向引用功能與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了java正則環(huán)視與反向引用的相關(guān)概念與使用方法,需要的朋友可以參考下
    2018-01-01
  • Java?IDEA集成開發(fā)工具中英文切換圖文教程

    Java?IDEA集成開發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時,看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關(guān)于Java?IDEA集成開發(fā)工具中英文切換的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • 使用Autowired為什么會被IDEA警告最佳修改方法

    使用Autowired為什么會被IDEA警告最佳修改方法

    這篇文章主要介紹了使用Autowired為什么會被IDEA警告,應(yīng)該怎么修改最佳,除了使用@Autowired以外,我們其實(shí)也有幾種好用的方式,使用@Resource替代@Autiwired方法是其中一種,只需要改變一個注解,這里就不展示了,需要的朋友可以參考下
    2023-02-02
  • 多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn)

    多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn)

    這篇文章主要介紹了多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn)

    java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn)

    本文主要介紹了java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java中的跨域和@CrossOrigin注解的作用詳解

    Java中的跨域和@CrossOrigin注解的作用詳解

    這篇文章主要介紹了Java中的跨域和@CrossOrigin注解的作用詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • Jasypt對SpringBoot配置文件加密

    Jasypt對SpringBoot配置文件加密

    數(shù)據(jù)庫密碼直接明文寫在配置中,對安全來說,是一個很大的挑戰(zhàn)。一旦密碼泄漏,將會帶來很大的安全隱患。尤其在一些企業(yè)對安全性要求很高,因此我們就考慮如何對密碼進(jìn)行加密。本文著重介紹Jasypt對SpringBoot配置文件加密。
    2021-05-05
  • JavaWeb框架MVC設(shè)計思想詳解

    JavaWeb框架MVC設(shè)計思想詳解

    這篇文章主要介紹了JavaWeb框架MVC設(shè)計思想詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    這篇文章主要介紹了淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論