本題實現兩個方法,乙個是補全表示式,
showstring, 另乙個是計算二元方程式的結果(這裡條件比較苛刻,每次只能為兩個元素,且必須要有右括號的情況,不然程式失效)
showstring
1.原理:
定義兩個堆疊,乙個是儲存資料的data型,
stackdata =
newstack<>();
另乙個是儲存操作符的ops型,
stackops =
newstack<>();
對原始資料進行歷遍操作:
三種情況: 1.獲得為運算元,放到運算元stack
2.獲得為「)」(右括號),進行判斷操作:
取得兩個運算元,pop兩次,
取得乙個操作符,pop一次,
然後新增相關的「()」左右括號,並儲存到datastack中,執行push操作。
3.直接執行psuh 到data的操作。
這裡畫了乙個操作草圖;
(自己動手一畫,邏輯就清楚了)
最後就可以得到完整的表示式。
getresult
同樣需要兩個stack存貯,邏輯與上面的類似,只是將其中的乙個stack型別改為double型,每次執行都是先提取兩個運算元和乙個操作符,然後判斷可以執行的型別,然後將結果放回到double型的stack中,並作為乙個double值繼續參與運算。當最後執行完成的時候,其中double的stack只有乙個元素存在,就是最後的結果。
**如下:
public class example1309
else if (input.equals(
")"))
if (vals.isempty()) //
double temp2 = vals.pop() ;
double temp1 = vals.pop() ;
string opt = ops.pop() ;
double result =
0.0;
if (opt.equals(
"+"))
else if (opt.equals(
"-"))
else if (opt.equals(
"*"))
else if (opt.equals(
"/"))
else
vals.push(result) ;
} else
}stdout.
println(vals.pop()) ;
}private static void
showstring(string inputs)
else if (input.equals(
")"))
if (data.isempty())
string data1 = data.pop() ;
string data2 = data.pop() ;
string opt = ops.pop() ;
data.push(
"(" + data2 + opt + data1 +
")") ;
} else
}stdout.
println(data.pop()) ;
}public static void
main(string args)
}執行結果圖:
利用堆疊進行表示式求值
基本策略 將中綴表示式轉換為字尾表示式,然後求值 中綴表示式轉換為字尾表示式的流程 從頭到尾讀取中綴表示式的每個物件,對不同的物件按不同的情況處理 1 運算數 直接輸出 2 左括號 壓入堆疊,入棧前左括號的優先順序最高,入棧之後其優先順序降到最低 3 右括號 將棧頂的運算子彈出並輸出,直到遇到左括號...
堆疊 表示式轉換
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。在一行中輸出轉換後的字尾表示式,要求不同物件 運算數...
表示式括號匹配
假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。輸入格式 一行 表示式 輸出格式 一行 yes 或 no 輸入樣例 1 2 x y...