平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。
字尾標記法:書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為:從左到右順序完成計算,並用結果取而代之。
例如:8-(3+26)/5+4可以寫為:8 3 2 6+5/-4+
其計算步驟為:
8 3 2 6 * + 5 / – 4 +
8 3 12 + 5 / – 4 +
8 15 5 / – 4 +
8 3 – 4 +
5 4 +
9編寫乙個程式,完成這個轉換,要求輸出的每乙個資料間都留乙個空格。
輸入格式
就一行,是乙個中綴表示式。輸入的符號中只有這些基本符號0123456789±/^(),並且不會出現形如2-3的格式。
表示式中的基本數字也都是一位的,不會出現形如12形式的數字。
所輸入的字串不要判錯。
輸出格式
若干個字尾表示式,第i+1行比第i行少乙個運算子和乙個運算元,最後一行只有乙個數字,表示運算結果。
輸入輸出樣例
輸入 #1複製
8-(3+2*6)/5+4
輸出 #1複製
8 3 2 6 * + 5 / - 4 +
8 3 12 + 5 / - 4 +
8 15 5 / - 4 +
8 3 - 4 +
5 4 +
9說明/提示
運算的結果可能為負數,/以整除運算。並且中間每一步都不會超過2^2
31。字串長度不超過100100
思路:只有一點,判斷棧頂元素和表示式當前元素優先順序關係的時候,一定要注意順序,先判空,再判括號,並且^符號的優先順序最高!!!
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
string s1,s2;
stack<
char
>stk;
int stk2[
1005
],top;
int len;
bool
check
(char x)
void
add(
char x)
void
cal(
char x)
void
solve()
else
else
if(s1[i]
==')'
) stk.
pop();
}else
} stk.
push
(s1[i]);
}}}while
(!stk.
empty()
)}void
print()
else
cal(s2[i]);
i++;for
(int j =
1;j <= top;j++
)for
(int j = i +
1;j < len;j++
)printf
("\n");
}}}int
main()
洛谷 P1175 表示式的轉換
平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。字尾標記法 書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為 從左到右順序完成計算,並用結果取而代之。例...
中綴表示式求值(P1175 表示式的轉換)
思路 先中綴表示式轉字尾,再對字尾表示式求值。中綴表示式轉字尾 o n 掃一遍輸入的中綴表示式 1.遇到數 直接輸出 2.遇到左括號 左括號直接入棧。3.遇到運算符號 利用建立的符號棧,棧內總原則為高階運算壓在低階運算之上。4.遇到加 減 乘 除 乘方,按照正常的運算優先順序處理 可以看一下p198...
Luogu1175 表示式的轉換 表示式樹
平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。字尾標記法 書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為 從左到右順序完成計算,並用結果取而代之。例...