算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入在一行中給出不含空格的中綴表示式,可包含+
、-
、*
、\
以及左右括號()
,表示式不超過20個字元。
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
序號
輸入輸出說明0
2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
正常測試6種運算子
1((2+3)*4-(8+2))/5
2 3 + 4 * 8 2 + - 5 /
巢狀括號
21314+25.5*12
1314 25.5 12 * +
運算數超過1位整數且有非整數出現
3-2*(+3)
-2 3 *
運算數前有正負號
4123
123只有乙個數字
借助輔助棧s2用於存運算子待操作運算子
出入狀態
s2棧頂運算子
+ -出:
+ - * /入:(
* /出:
* /入:
+ - ((入:
直接進)
出:直接出直到遇到 (
#include
#include
#include
#include
using
namespace std;
intmain()
//+的前面是 + - * / ( 且後面是數字時說明該資料是正數,忽略+
if(i !=
0&& s[i]
=='+'&&(
(s[i -1]
<
'0'|| s[i -1]
>
'9')
&&(s[i -1]
!=')'))
&&(s[i +1]
>=
'0'&& s[i +1]
<=
'9')
)continue
;//-的前面是 + - * / ( 是數字時說明該資料是負數
if(i !=
0&& s[i]
=='-'&&(
(s[i -1]
<
'0'|| s[i -1]
>
'9')
&& s[i -1]
!=')')&&
(s[i +1]
>=
'0'|| s[i +1]
<=
'9')
)//運算子前後都是數字的時候
if(s[i]
=='+'
|| s[i]
=='-'
|| s[i]
=='*'
|| s[i]
=='/'
|| s[i]
=='('
|| s[i]
==')'
) data +
= s[i]
;//連線前乙個字元
if(i == s.
size()
-1)v.push_back
(data);}
stacks1, s2;
//借助輔助棧s2用於存運算子
string ch;
for(
int i =
0; i < v.
size()
; i++
) s2.
push
(ch);}
}else s2.
push
(ch)
;//符號空直接插入
}else
if(ch ==
"*"|| ch ==
"/")
s2.push
(ch);}
}else s2.
push
(ch)
;//符號空直接插入
}else
if(ch ==
"(")
s2.push
(ch)
;else
if(ch ==
")")
s1.push
(s2.
top())
; s2.
pop();
}}else s1.
push
(ch);}
while
(!s2.
empty()
) stackans;
while
(!s1.
empty()
)int flag =0;
while
(!ans.
empty()
)return0;
}
錯誤點:資料預處理時的特判部分卡了好久,卡在「運算數前有正負號」這部分
表示式轉換 中綴表示式轉換為字尾表示式
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...
表示式轉換
2 3 7 4 8 4 2 3 7 4 8 4 思路 a.若為 入棧 b.若為 則依次把棧中的的運算子加入字尾表示式中,直到出現 從棧中刪除 c.若為 除括號外的其他運算子,當其優先順序高於除 以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,...
表示式轉換
7 1 表示式轉換 25 分 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。在一行中輸出轉換後的字...