表示式求值 一位數字

2021-06-19 15:43:22 字數 1657 閱讀 4756

將乙個中綴表示式轉化為逆波蘭式的一般演算法是:

首先分配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...