利用堆疊補全表示式左括號(1309 P102)

2021-08-06 01:46:04 字數 1686 閱讀 9482

本題實現兩個方法,乙個是補全表示式,

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...