中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用棧使用簡易計算器(Java實現)

發布時間:2020-09-17 19:39:25 來源:腳本之家 閱讀:134 作者:dreamer_it 欄目:編程語言

題目:使用棧計算類似表達式:5+2*3-2  的計算結果 

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

分析思路:

1、創建一個數棧和一個符號棧,數棧用于存放數字,符號棧用于存放符號

2、創建一個索引index,用于遍歷表達式

3、掃描表達式,如果是數字直接進入數棧,如果是符號,則需要進行判斷。分兩種情況,一是當符號棧如果為空,直接將符號入棧。二是不為空,先比較當前棧頂的符號與將要進棧的符號的優先級大小,如果將要進棧的操作符的優先級小,則將數棧的兩個數彈出,符號棧的操作符彈出一個,并進行計算,計算之后的結果直接進入數棧,如果優先級大,就直接進棧。

4、掃描完表達式之后,就順序的從數棧和符號棧順序的彈出相應的數字和操作符,并進行計算。

5、當符號棧為空時,說明已經計算完了,此時留在數棧的只有一個數字,就是表達式計算之后的結果。

利用棧使用簡易計算器(Java實現) 

代碼實現

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;
  }
}

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泾源县| 株洲县| 宝丰县| 蒙城县| 屏东市| 牡丹江市| 西华县| 商水县| 新晃| 伊宁市| 买车| 库车县| 遂溪县| 通江县| 那曲县| 安庆市| 大兴区| 开江县| 瑞安市| 鹿泉市| 大方县| 抚顺县| 剑川县| 关岭| 靖安县| 青海省| 五原县| 黄平县| 洪洞县| 涡阳县| 巴南区| 平安县| 达拉特旗| 从化市| 家居| 唐山市| 深泽县| 芮城县| 内丘县| 永济市| 峨山|