鬱悶的C小加(一)

2021-07-08 10:06:28 字數 2425 閱讀 5313

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

我們熟悉的表示式如a+b、a+b*(c+d)等都屬於中綴表示式。中綴表示式就是(對於雙目運算子來說)操作符在兩個運算元中間:num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後:num1 num2 operand。acm隊的「c小加」正在鬱悶怎樣把乙個中綴表示式轉換為字尾表示式,現在請你設計乙個程式,幫助c小加把中綴表示式轉換成字尾表示式。為簡化問題,運算元均為個位數,操作符只有+-*/ 和小括號。

輸入第一行輸入t,表示有t組測試資料(t<10)。

每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。並且輸入資料不會出現不匹配現象。

輸出每組輸出都單獨成行,輸出轉換的字尾表示式。

樣例輸入

21+2(1+2)*3+4*5

樣例輸出

12+12+3*45*+

詳解:

解析:直接切入正題,很明顯是將中綴表示式轉換為字尾表示式,字尾表示式也成為逆波蘭式,我們常見的表示式就是中綴表示式,字尾表示式就是將運算元放到前面,運算子放到後面,思想是中綴表示式-->建立二叉樹-->後序遍歷就是得到字尾表示式。第一次開始做感覺建二叉樹太麻煩,於是想直接一次遍歷字串,將運算子壓入符號棧中是否可以,當然可以,將運算子壓入棧中,如果遇到當前的運算子的優先順序低的話就先出棧,反之入棧。這個地方稍微有一點點複雜,弄清楚就好了。運算子棧如果開始壓入#的話,可以在某些出棧的情況下要判斷棧是否為空,

分析:我們並不能從某一種遍歷方式推斷出唯一的二叉樹,也就是說,這是個單向編碼的過程。而當我們有乙個二叉樹的兩種遍歷方式的表述時,似乎也不能做到盡善盡美:前序遍歷和中序遍歷的組合或者中序遍歷和後序遍歷的組合可以逆向生成唯一的二叉樹,但是偏偏前序遍歷和後續遍歷卻不可以。這其中的原因是什麼呢?

前序遍歷和中序遍歷、中序遍歷和後序遍歷之所以能夠還原成唯一的二叉樹,說明他們包含的資訊已經足以覆蓋這棵二叉樹的全部資訊。而本題由中綴表示式唯一確定乙個字尾表示式是由於他的特殊性:非葉子節點必定是符號,只有葉子節點才是數字。

#include #include #include using std::endl;

using std::cin;

using std::cout;

using std::string;

using std::stack;

//定義運算子的優先順序

int priority(char ch)

return num;

}int main()

else

//然後再壓入當前的運算子

op.push(str1[i]);

}}else

} //如果此時符號棧仍不為空則全部出棧

while(op.top()!='#')

cout << str2 << endl;

} return 0;

}

原理就是這個二叉樹的所有葉子節點都是運算元,而內節點都是運算子,定義了資料結構,寫了建立節點的函式

#include #include #include #include using std::endl;

using std::cin;

using std::cout;

using std::string;

using std::stack;

//定義樹的節點

typedef struct nodebinode,*btree;

//定義運算子的優先順序

int priority(char ch)

return num;

}//定義運算子棧和運算元棧

stackop;

stacknum;

//由運算子棧的棧頂和運算元棧的棧頂前兩個元素組成乙個樹節點

void createnode(btree &t)

//由中綴表示式建立二叉樹

//s為中綴表示式

void createbtree(const string &s,btree &t)

//然後將當前運算子壓入運算子棧中去

op.push(s[i]);

}else

} //當字元棧非空的時候

while(!op.empty()) }

//後序遍歷建立的二叉樹

void postorder(btree &t)

}int main()

return 0;

}

鬱悶的C小加(一)

我們熟悉的表示式如 a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2 同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 operand acm 隊的 c 小加 正在鬱悶怎樣把乙個中綴表示式轉換為字...

nyoj 257鬱悶的c小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...

NYOJ 257 鬱悶的C小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...