給定出棧序列判斷棧容量:
經典例題:已知出棧順序求可能的入棧順序。
要求的出棧順序:
p1、……、pi、……、pj、……pk、……、pn
可能的入棧順序:
其中只有第四組無法實現,因為如果最後乙個入棧的元素第乙個出棧,那麼其餘元素的出棧順序就是固定的,不能亂來。
三種表示式:
1.中綴表示式: a+b
2.字首表示式(波蘭式): +ab
3.字尾表示式(逆波蘭式): ab+
做法:變換符號位置,然後去括號
1.中綴表示式轉換成字首表示式:
2.中綴表示式轉換成字尾表示式:
♥設計程式將中綴表示式轉換為字尾表示式:
輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+、-、*、\以及左右括號(
),表示式不超過20個字元。
輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:2+
3*(7
-4)+
8/4輸出樣例:23
74-*
+84/
+
c++**實現:
#include
using
namespace std;
const
int maxn =
1e4+10;
typedef
long
long ll;
stack<
char
> sta;
intmain()
if(str[i]
!='+'
)while
(str[i+1]
=='.'
||(str[i+1]
>=
'0'&& str[i+1]
<=
'9')
) isfirst =
false;}
else
sta.
pop();
}else
if(sta.
empty()
||mp[str[i]
]> mp[sta.
top()]
)else
sta.
push
(str[i]);
}}}while
(!sta.
empty()
)return0;
}/*1、建乙個空棧儲存運算子
2、當碰到數字直接輸出,值的注意的是這裡的數字可能是小數、負數(負號和數字是一起輸出的)或帶正號的數字;
3、當碰到運算子的時候,先比較當前符號a與棧頂符號b運算優先順序的大小,如果a > b直接壓入棧中,否則就輸出棧中的運算子直到為空或棧頂元素為『(』;
4、當碰到')'運算子的時候,直接輸出棧中的運算子,直到棧為空或者碰到運算子'(';
5、最後輸出棧中的運算子,直到棧為空。
6、最卡格式的一種情況就是運算子和右括號連續出現的情況比如2+(+5)-1,要仔細考慮輸出格式的處理;
7、『+』,『-』和數字一起輸出的情況是正負號的在字串的第一位或者是正負號前邊是『(』,其餘情況都是作為運算子處理的。
*/
3.字尾表示式轉換成中綴表示式:
4.字尾表示式轉換成字首表示式:
利用棧和佇列進行表示式求值
深入了解棧和佇列的特性,學會在實際問題下靈活運用它們。表示式求值運算是實現程式語言的基本問題之一,也是棧應用的乙個典型例子。設計並演示用算符優先順序對算術表示式的求解過程。1 演算法優先級別如下 2 以字串行的形式從終端輸入語法正確 不含變數的算術表示式,利用給出的算符優先順序關係,實現對算術四則混...
棧的應用 數值轉換與表示式求值
2.表示式求值 原理大家肯定都知道,就除k取餘,直到商為0時,倒序輸出餘數即為轉換後的k進製數。一說倒序,就很符合棧 last in first out,lifo 後進先出 的思想。這個簡單,直接上 include include include define max 100 定義棧的最大值 typ...
中綴表示式與字尾表示式的轉換
從最簡單的例子出發 1 2 3 4 轉換成字尾表示式 1 2 3 4 關鍵是要理解 字尾表示式是借用堆疊的 先出來實現運算的,即 上述的表示式可以以佇列形式寫出,然後借用堆疊進行計算 如果是運算元,壓棧,如果是操作符,一次性彈出兩個,分別是運算元2和運算元1 在理解這個原因的基礎上,再看,中綴和字尾...