將乙個中綴表示式轉化為逆波蘭式的一般演算法是:
首先分配2個棧,乙個作為臨時儲存運算子的棧stmp,乙個作為輸入逆波蘭式的棧spostfit
從中綴式的左端開始取字元,逐序進行如下步驟:
(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入spostfit棧
(2)若取出的字元是運算子,則將該運算子與stmp棧棧頂元素比較,
如果該運算子優先順序大於stmp棧棧頂運算子優先順序,則將該運算子壓入stmp棧;
否則,將stmp棧的棧頂運算子彈出,壓入spostfit棧中,
直至stmp棧棧頂運算子低於(不包括等於)該運算子優先順序,則將該運算子壓入stmp棧。
注意優先順序關係:」(」 < 「+」, 」-」 < 「*」, 「/」
(3)若取出的字元是「(」,則直接壓入stmp棧。
(4)若取出的字元是「)」,則將距離stmp棧棧頂最近的「(」之間的運算子,逐個出棧,依次壓入spostfit棧,此時拋棄「(」。
(5)重複上面的1~4步,直至處理完所有的輸入字元
(6)將stmp棧內所有運算子,逐個出棧,依次壓入spostfit棧。
#include
#include
#include
#include
using std::stack;
using std::string;
using std::cout;
using std::cin;
using std::endl;
void topostfix(string& exp, string& postfix)
stmp.pop();
}else if ('+' == cur || '-' == cur)
stmp.push(cur);
}else if ('*' == cur || '/' == cur)
stmp.push(cur);
}else
}while (!stmp.empty())
int size = spostfix.size();
char *arr = new char[size+1];
memset(arr, 0, (size+1)*sizeof(char));
for (int j = 0; j < size; ++j)
postfix = arr;
delete arr;
arr = null;
}測試用例:
(1+5)/3*2-4*2/(1+3)/2-1
15+3/2*42*13+/2/-1-
1*2+(2-1)
12*21-+
8-(3+2*6)/5+4
8326*+5/-4+
(a+b)*c-(a+b)/e
ab+c*ab+e/-
逆波蘭式求值:
順序處理逆波蘭式的每一位
如果該位是乙個數,將這個數入棧
如果該位是乙個運算子,連續進行兩次出棧操作,得到兩個元素,對這兩個元素用該運算子進行運算,將所得的結果壓入棧
int calcpostfix(string& postfix)
stmp.push(res+'0');}}
return (stmp.top() - '0');
}int main()
彙編一位數加法
源於朱耀庭老師的 組合語言程式設計 清華大學出版社 大體思路 把結果看成兩位十進位制,add之後把結果除以10,商儲存到al,餘數儲存到ah,有進製結果顯示正常,沒有進製則高位顯示零,低位顯示結果 在32位win7下masm5編譯通過 mov dl,2號功能呼叫顯示問號 mov ah,02h int...
一位陣列去除重複
一些同學在面試的時候會碰到一些小問題,這些問題雖小,卻能很好的顯示出來你以往工作情況和對待程式設計的狀態。下面舉乙個例子,關於 陣列去重 如果有同學面試的時候再碰到就可以順手而來了。如題 寫乙個方法去除陣列string a new string 中的重複元素。答 這裡所寫的方法用的 泛型 所以要先引...
一位陣列的應用 查詢
1.順序查詢 當被查詢的資料無序排列時,只能採用順序查詢法進行查詢。順序查詢演算法的思想是 對待查資料x一一與被查資料 陣列元素 進行比較,直到找到與待查資料相等的資料並返回陣列元素的下標 如果找不到,則返回 1.例1 順序查詢 include main int num,i 0 printf ple...