最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

提示:簡易計(jì)算器操作符號(hào)限于+,-,*,/的計(jì)算

分析思路:

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

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

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

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

5、當(dāng)符號(hào)棧為空時(shí),說明已經(jīng)計(jì)算完了,此時(shí)留在數(shù)棧的只有一個(gè)數(shù)字,就是表達(dá)式計(jì)算之后的結(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;//定義一個(gè)索引值,用于遍歷表達(dá)式
    int num1 = 0;
    int num2 = 0;
    int res = 0;//計(jì)算結(jié)果
    char ch = ' ';
    int oper = 0;
    String keepNum = "";
    ArrayStack numStack = new ArrayStack(10);//創(chuàng)建一個(gè)數(shù)棧
    ArrayStack operStack = new ArrayStack(10);//創(chuàng)建一個(gè)符號(hào)棧
    while (true){
      ch = express.substring(index,index+1).charAt(0);//不停的遍歷操作符
      //判斷是否是操作符
      if (operStack.isOper(ch)){
        //判斷當(dāng)前符號(hào)棧是否有符號(hào)存在
        if(!operStack.isEmpty()){
          //不為空則判斷優(yōu)先級(jí)
          if(operStack.priority(ch)<=operStack.priority(operStack.peek())){
            //當(dāng)優(yōu)先級(jí)小于棧頂?shù)闹禃r(shí)候,彈出兩個(gè)數(shù)棧的值進(jìn)行計(jì)算
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            res = operStack.cal(num1,num2,oper);
            //計(jì)算以后將計(jì)算得到的值放入數(shù)棧
            numStack.push(res);
            //同時(shí)將此時(shí)的操作符放入符號(hào)棧
            operStack.push(ch);
          }else{
            //優(yōu)先級(jí)
            operStack.push(ch);
          }
        }else{
          //為空直接將符號(hào)入棧
          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)行計(jì)算
    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();
  }
 
  /**
   * 判斷是否是一個(gè)操作符
   * @param oper 傳入的字符
   * @return 如是操作符返回true,否則返回false
   */
  public boolean isOper(char oper){
    return oper == '+' || oper == '-' || oper =='*' || oper == '/';
  }
 
  /**
   * 判斷操作符的優(yōu)先級(jí)
   * @param oper 傳入的優(yōu)先級(jí)
   * @return 返回優(yōu)先級(jí) 分別是1,-1,0
   */
  public int priority(int oper ){
    if(oper == '*' || oper == '/'){
      return 1;
    } else if(oper == '+' || oper == '-'){
      return 0;
    }else {
      return -1;
    }
  }
 
  //計(jì)算方法
  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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁數(shù)據(jù)查詢的過程詳解

    利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁數(shù)據(jù)查詢的過程詳解

    這篇文章主要給大家介紹了關(guān)于利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁數(shù)據(jù)查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • SpringBoot整合Netty心跳機(jī)制過程詳解

    SpringBoot整合Netty心跳機(jī)制過程詳解

    這篇文章主要介紹了SpringBoot整合Netty心跳機(jī)制過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    這篇文章主要給大家介紹了關(guān)于Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java用正則表達(dá)式實(shí)現(xiàn)${name}形式的字符串模板實(shí)例

    Java用正則表達(dá)式實(shí)現(xiàn)${name}形式的字符串模板實(shí)例

    這篇文章主要給大家介紹了Java如何用正則表達(dá)式實(shí)現(xiàn)${name}形式的字符串模板,文章給出詳細(xì)的實(shí)例代碼,對(duì)大家的理解和學(xué)習(xí)會(huì)很有幫助,有需要的朋友們下面來一起看看吧。
    2016-12-12
  • springboot實(shí)現(xiàn)啟動(dòng)直接訪問項(xiàng)目地址

    springboot實(shí)現(xiàn)啟動(dòng)直接訪問項(xiàng)目地址

    這篇文章主要介紹了springboot實(shí)現(xiàn)啟動(dòng)直接訪問項(xiàng)目地址,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java支持方法重載的原因

    Java支持方法重載的原因

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java方法重載展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot集成消息隊(duì)列的項(xiàng)目實(shí)踐

    SpringBoot集成消息隊(duì)列的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot集成消息隊(duì)列的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解

    Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解

    這篇文章主要介紹了Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解,請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向,但二者是完全不同的,所以我們今天就來盤他們的區(qū)別介紹,需要的朋友可以參考一下
    2022-07-07
  • Spring AOP注解案例及基本原理詳解

    Spring AOP注解案例及基本原理詳解

    這篇文章主要介紹了Spring AOP注解案例及基本原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21解決辦法

    idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21解決辦法

    這篇文章主要給大家介紹了關(guān)于idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21的解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

尼木县| 遂平县| 洛扎县| 崇州市| 清涧县| 手机| 呼和浩特市| 裕民县| 修水县| 霞浦县| 芷江| 太原市| 泾源县| 甘孜| 绵阳市| 朝阳区| 威远县| 枞阳县| 塔城市| 遂宁市| 鹰潭市| 墨江| 绥阳县| 余姚市| 宁夏| 常山县| 蒲城县| 金乡县| 安福县| 惠安县| 延津县| 信阳市| 尤溪县| 塔城市| 东光县| 上犹县| 衡南县| 梨树县| 青州市| 霍邱县| 扎鲁特旗|