算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+
、-
、*
、\
以及左右括號()
,表示式不超過20個字元。
輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
2+3
*(7-
4)+8
/4
輸出樣例:
237
4-*+
84/+
數字2
,輸出 [數字在字尾表示式中都是直接輸出]
操作符+
,入棧;
操作符*
,入棧;
操作符(
,入棧,
數字7
,輸出;
操作符-
,入棧;
數字4
,輸出,
操作符)
,匹配棧中的(
,並匹配前將棧頂資料依次出棧,即將(
和-
出棧,並輸出-
:
操作符+
,此時棧頂元素是操作符*
,[按照先乘除後加減的原理],此時棧頂的*
優先順序比將要入棧的*
要大,所以,先讓棧內*
和*
出棧,並輸出;
遇到數字8
,輸出;
操作符/
,入棧;
數字4,輸出;
棧中仍有運算元,依次出棧列印棧中的操作符。
規則總結:
從左到右遍歷中綴表示式的每個數字和符號,若是數字則直接輸出,若是操作符,則判斷其與棧頂操作符的優先順序,是右括號或是優先順序低於或等於棧頂操作符,則棧頂元素依次出棧並輸出,直到遇到左括號或棧空才將後乙個操作符入棧。
#include
#include
#include
#include
using
namespace std;
string input, tmp;
map<
char
,int
>opera =,,
,,,}
;vectoroutput;
stack<
char
>st;
intmain()
);while
(i +
1< input.
size()
&&!opera.
count
(input[i +1]
))tmp +
= input[
++i]
; output.
push_back
(tmp);}
else
if(input[i]
=='('
) st.
push
('(');
else
if(input[i]
==')'))
; st.
pop();
} st.
pop();
}else);
st.pop();
} st.
push
(input[i]);
}while
(st.
size()
)); st.
pop();
}for
(int i =
0; i < output.
size()
;++i)
cout <<
(i ?
" ":"")
<< output[i]
;return0;
}
表示式轉換 25 分
首先規定優先順序,括號為最高優先順序,乘號或除號為次優先順序,加或減號為最低優先順序,至於數字,碰到就直接輸出即可。既然是數字,就有小數,整數,正數,負數之分,還有關於二元運算子的輸出,在括號內的二元運算子優先輸出,優先順序高的優先輸出 當然括號不算啊 根據題意,在輸出時可分為以下幾種情況。incl...
5 20 表示式轉換 25分
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...
5 20 表示式轉換 25分
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...