算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+、-、*、\以及左右括號(),表示式不超過20個字元。
輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
知識點:將中綴表示式轉化為字尾表示式:
兩種情況:
(1)沒有括號的中綴表示式轉化為字尾表示式:
(2)帶有括號的中綴表示式轉化為字尾表示式:
分析:本題是帶有括號的中綴表示式,需要利用第二種方式實現,模擬過程我會在**上詳解
這裡說一下這道題的細節問題:
中綴表示式轉換為字尾表示式:對於本題而言,細節過多,在完成表示式轉換的基礎上
1.需要控制空格,首尾不能出現空格
2.需要判斷一位以上的數字之間不能有空格
3.需要判斷小數的情況,注意之間不能有空格
4.需要判斷鑲嵌括號的情況,容易出現格式錯誤
例如:當一開始就輸入多個空格會使首位出現空格
5.需要判斷正負號
(1)對於正號,當出現在第一位時需直接特判(在第一位無需加括號)
未在第一位出現正號一定會在括號內,而且輸出時正號要省略
(2)對於負號,當出現在第一位時需要直接特判(在第一位出現無需加括號)
未在第一位出現負號一定會在括號內,需要輸出負號
(3)注意控制好空格,防止格式錯誤
下面是**:
#include
#include
#include
#include
#include
using
namespace std;
const
int m=
1010
;char str[m]
,st[m]
,c;stack<
char
> q;
intmain()
///解決超過一位數的問題
if(f==0)
///遇到數字並且前乙個也是數字或'.'輸出
printf
("%c"
,str[i]);
else
///f=1時遇到數字加空格輸出,並使f=0
}///解決小數問題
else
if(str[i]
=='.'
)///遇到點說明為小數直接輸出
///解決第一位為正數帶'+'的問題
else
if(i==
0&&str[i]
=='+'
)///解決第一位為正數帶'-'的問題
else
if(i==
0&&str[i]
=='-'
)///解決非第一位為正數帶'-'的問題
else
if(str[i]
=='('
&&str[i+1]
=='-'
)///解決非第一位為正數帶'+'的問題
else
if(str[i]
=='('
&&str[i+1]
=='+'
)///當遇見左括號
else
if(str[i]
=='('
)///遇見右括號
else
if(str[i]
==')'
)//printf("%c\n",q.top());
q.pop();
///將左括號出棧
}else
///當需要入棧的符號優先順序大於棧頂符號優先順序
elseif(
(str[i]
=='*'
||str[i]
=='/')&&
(q.top()
=='+'
||q.
top()==
'-')
)///入棧的符號優先順序小於或等於棧頂符號優先順序
///棧中元素不為空且棧頂元素不是左括號
else
///情況三
else
if(str[i]
=='*'
||str[i]
=='/'
)///情況四
else
if(str[i]
=='+'
||str[i]
=='-')}
///當棧頂元素為'+'或'-'
else
if(q.
top()==
'+'||q.
top()==
'-')
else
if(str[i]
=='+'
||str[i]
=='-')}
}}}///當棧中符號未完全出棧
while
(q.size()
!=0)printf
("\n");
return0;
}
中綴表示式轉換為字尾表示式
今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...