棧的應用-四則運算(中綴與字尾表示式轉換--Java原始碼)
參考連結
結合原文章,做了一定修改,增加Java原始碼實現
1. 概述
對於四則運算表示式的計算,是輸入資料結構中棧的應用,即重點是中綴表示式
轉換為字尾表示式
2. 字尾表示式計算
- 為了解釋字尾表示式的好處,我們先來看看,計算機是如何計算字尾表示式的
- 字尾表示式例項
9 3 1 - 3 * + 10 2 / +
- 計算規則:從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到是符號,就將處於棧頂的兩個數字出棧,進行計算,然後計算結果進棧,一直到最終獲得結果。
- 計算過程:
3. 中綴表示式轉字尾表示式
我們把平時標準的四則運算表示式比如
9+(3-1)*3+10/2
叫做中綴表示式。
中綴表示式:9+(3-1)*3+10/2
轉換字尾表示式9 3 1 - 3 * + 10 2 / +
轉換規則:
- 噹噹前字元為
數字
時,直接輸出; - 噹噹前字元為
(
時,將其壓棧; - 噹噹前字元為
)
時,則彈出堆疊中最上的(
之前的所有運算子並輸出,然後刪除堆疊中的(
; - 噹噹前字元為運算子時,則依次彈出堆疊中優先順序
大於等於
當前運算子的(到”(“之前為止),輸出,再將當前運算子壓棧;
最後彈出所有棧中的內容輸出
- 噹噹前字元為
轉換過程
4. 原始碼實現
package data_structure;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 棧的應用
* https://blog.csdn.net/u011857433/article/details/79993385
* 四則運算表示式求職,中綴表示式與字尾表示式轉換
*/
public class ReversePoland {
public static void main(String[] args) {
// Calculation1("9 3 1 - 3 * + 10 2 / +");
System.out.println(Calculation2("9 + ( 3 - 1 ) * 3 + 10 / 2" ));
}
/**
* 計算字尾表示式
* @param inputString 9 3 1 - 3 * + 10 2 / + 以空格分隔
*/
public static int Calculation1(String inputString){
String[] input = inputString.split(" ");
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < input.length; i++) {
String s = input[i];
if (isNumber(s)) //如果是數字,則入棧
stack.push(Integer.valueOf(s));
else {
//遇到運算子,則從棧中彈出兩個數字,進行運算
int n1 = stack.pop();
int n2 = stack.pop();
int res = 0;
switch (s){
case "+":res = n1 + n2;break;
case "-":res = n2 - n1;break;
case "*":res = n1 * n2;break;
case "/":res = n2 / n1;break;
}
stack.push(res);
}
}
return stack.pop();
}
/**
* 將中綴表示式轉化為字尾表示式
* @param string 9 + ( 3 - 1 ) * 3 + 10 / 2
* @return
*/
public static String Calculation2(String string){
Stack<String> stack = new Stack();
String[] chars = string.split(" ");
String res = "";
for (int i = 0; i < chars.length; i++) {
String s = String.valueOf(chars[i]);
if (isNumber(s)){
if (res.length()==0)
res += s;
else
res += " "+s;
}else {
if (s.equals("(")){
stack.push(s);
}else {
if (s.equals(")")){
String t = "";
String s1 = "";
while (!(t = stack.pop()).equals("(")){
s1 += " "+t;
}
res += s1;
}else {
int priority = getPriority(s);
String s1 = "";
boolean flag = false;
while (!stack.empty()){
flag = false;
s1 = stack.pop();
if (s1.equals("(")){
// stack.push("(");
break;
}
if (getPriority(s1) >= priority){
res += " " + s1;
flag = true;
}
}
if (!s1.equals("") && !flag)
stack.push(s1);
stack.push(s);
}
}
}
}
while (!stack.empty()){
res += " " + stack.pop();
}
return res;
}
//獲取運算子的優先順序
public static int getPriority(String s){
Map<String,Integer> map = new HashMap<>();
map.put("+",0);
map.put("-",0);
map.put("*",1);
map.put("/",1);
map.put("(",2);
map.put(")",2);
return map.get(s);
}
public static boolean isNumber(String c){
Pattern pattern = Pattern.compile("^(0|[1-9][0-9]*)$");
Matcher matcher = pattern.matcher(c);
boolean res = matcher.find();
return res;
}
}
相關推薦
棧的應用-四則運算(中綴與字尾表示式轉換--Java原始碼)
參考連結 結合原文章,做了一定修改,增加Java原始碼實現 1. 概述 對於四則運算表示式的計算,是輸入資料結構中棧的應用,即重點是中綴表示式轉換為字尾表示式 2. 字尾表示式計算 為了解釋字尾表示式的好處,我們先來
順序棧應用-字首、中綴、字尾表示式
轉載自 http://blog.csdn.net/antineutrino/article/details/6763722/ 關鍵字:概念, 字首表示式, 字首記法, 中綴表示式, 中綴記法, 波蘭式, 字尾表示式, 字尾記法, 逆波蘭式 它們都是對錶達式的記法,因此也被稱為字首記法、中綴記
【資料結構】棧的應用---四則運算表示式求值(中綴表示式與字尾表示式轉換)
用計算機實現帶括號的四則運算的方式。 這裡的困難在於乘除運算的優先順序高於加減運算,並且加入了括號,使得問題變得更加困難。 20世紀50年代,波蘭邏輯學家想到了一種不需要括號的字尾表達法,我們也把它稱為逆波蘭表示。 比如:9+(3-1)*3+10/2,如果
棧應用2(中綴表示式轉換成字尾表示式)-筆記
問題:如何使用棧來實現將中綴轉換為字尾表示式的演算法? 解答:在討論演算法前,首先介紹中綴、字首和字尾表示式的定義 中綴:中綴表示式由一個單一字元或運算子,連線前後兩個中綴字串共同組成。 A A+B (A+B)+(C+D) 字首:字首表示式由一個單一字元或運算子,隨後是兩個字首字串共同組成。
字首、中綴、字尾表示式轉換詳解
字首、中綴、字尾表示式轉換詳解 昨天參加了ebay實習生筆試題,其中一道題目給定了字首表示式,讓我們求轉換成中綴表示式時輔助棧的做多情況下容乃幾個元素以及中綴表示式的值。當時沒有做出來,會後後網上查了些資料,發現很少有文章將字首、中綴和字尾表示式之間的轉化覆蓋了,所以寫
棧的簡單應用——中綴表示式與字尾表示式
中綴表示式:(1+((2+3)*(4*5))) E.W.Dijkstra雙棧演算法 1.將運算元壓入運算元棧。 2.將運算子壓入運算子棧。 3.忽略左括號。 4.在遇到右括號時,彈出一個運算子,彈出所需數量的操縱數,並將運算子和運算元的運算結果壓入運算元棧。 public
基礎演算法與資料結構(二)字首、中綴、字尾表示式
目錄 簡介 字首表示式計算 字尾表示式計算 簡介 中綴表示式(正常的表示式) \[ (1+2)*3-4 \] 字首表示式(運算子位於運算元之前) \[ -*+1234 \] 字尾表示式(運算子位於運算元之後) \[ 12+3*4- \] 字首表示式計算 從右向左遍歷,
波蘭表示法與逆波蘭表示法(字首、中綴、字尾表示式)
1、為什麼要把中綴表示式轉化為字尾,字首? 計算機沒法計算帶有括號,以及區分優先順序的表示式,或者說很難計算。使用字尾,字首,消除了括號和優先順序。 2、計算機如何計算字尾,字首表示式? 計算字尾:從左到右遍歷字尾表示式,遇到運算元,放進棧,遇到操作符,棧頂兩個數出
順序棧應用2(利用順序棧將中綴式轉換成前、字尾式並求值)
/* 中綴轉字首參考演算法: 1)求輸入串的逆序。(中綴轉字首是從右向左訪問表示式) 2)檢查輸入的下一元素。 3)假如是運算元,把它新增到輸出串中。 4)假如是閉括號,將它壓棧。 5)假如是運算子, i)假如棧空,此運算子入棧。 ii)假如棧頂是閉括號,此運算子入棧。 i
(一道老坑爹的題)第三章棧作業題2-棧及其應用-計算機17級 7-1 表示式轉換 (25 分)
7-1 表示式轉換 (25 分) 算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。 輸入格式: 輸入在一行中給出不含空格的中綴表示式,可
中綴表示式與字尾表示式之間的互轉及求值
中綴表示式:常見的運算表示式,如(3+4)×5-6 字首表示式又稱波蘭式:運算子位於運算元之前,比如:- × + 3 4 5 6 字尾表示式又稱逆波蘭表示式:與字首表示式相似,只是運算子位於運算元之後,如:3 4 + 5 × 6 - 中綴表示式轉字尾表示式
表示式求值(中綴轉字尾及字尾表示式求值)
。中綴表示式轉字尾表示式: 中綴表示式轉字尾表示式遵循以下原則: 1.遇到運算元,直接輸出; 2.棧為空時,遇到運算子,入棧; 3.遇到左括號,將其入棧; 4.遇到右括號,執行出棧操作,
中綴表示式與字尾表示式的轉換及字尾表示式的計算
一.字尾表示式的計算 字尾表示式: 指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行。(不再考慮運算子的優先規則)。 中綴表示式: 也就是我們日常最容易見到的表示式,從左至右考慮運算子的優先原則。
資料結構中字尾表示式的求解,以及中綴與字尾的轉化過程
表示式的求解是程式中的一個最基本的問題(王道說的)。他實際是一個棧的典型應用。其中,中綴表示式不僅僅注意的事運算的優先順序,還有括號。而後綴表示式的運算子在運算元的後面,在後綴表示式中已考慮了運算子的優先順序,沒有括號,只有運算元和運算子。如: 中綴表示式:A+B*(C-D
字首,中綴,字尾表示式及其求值和轉換
一.四則運算表示式 我們最常見的運算表示式是 : 12 * (3 + 4) - 6 + 8 / 2 這種型別,這就被稱為是中綴表示式。 我們要用計算機來計算這一串表示式,然而表示式中涉及運算子的優先順序順序還有括號的干擾等,我們必須轉化為一種易於計算的形式,於是這裡就出現
【轉載】字首、中綴、字尾表示式(逆波蘭表示式)
在這裡首先感謝部落格園的chensongxian這位大佬貢獻了這篇部落格,當時看了這篇部落格,我茅塞頓開,在此轉載,如有冒犯,聯絡我,我會立刻刪除。 介紹 字首表示式、中綴表示式、字尾表示式都是四則運算的表達方式,用以四則運算表示式求值 ,即數學表示式的求職 中綴表
棧應用1(判定括號是否匹配)-筆記
問題:如何使用棧來判定括號是否匹配 解答:對於給定的表示式,可以使用棧來實現括號匹配判定演算法。這個演算法在編譯器中非常重要。解析器每次讀入一個字元,如果字元是一個開分隔符(如(、{、或 [ ),那麼將其入棧。若讀入的是一個閉分隔符(如)、}、或 ] ),那麼將棧頂的開分隔符出棧,並與閉分隔
深度學習框架tensorflow學習與應用7(改變模型和優化器提升準確率)
#訓練 train_step = tf.train.AdamOptimizer(lr).minimize(loss) 原來的程式碼: # coding: utf-8 # In[ ]: import tensorflow as tf from tensorflow.examples.tu
字首、中綴、字尾表示式相互轉換
這裡只提供了使用棧的方法,還可以利用樹的遍歷實現。 中綴表示式轉換為字首表示式。 首先建立算術符棧OPTR和表示式棧RESULT並置空,然後依次逆序檢查中綴表示式每個字元,不同字元按不同情況處理: (1).若是空格直接跳過。 (2).若是運算元直接壓入RESULT棧。 (3).若是‘
【軟考】字首、中綴、字尾表示式
關鍵字:概念, 字首表示式, 字首記法, 中綴表示式, 中綴記法, 波蘭式, 字尾表示式, 字尾記法, 逆波蘭式 它們都是對錶達式的記法,因此也被稱為字首記法、中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同:字首表示式的運算子位於