字尾表示式

2021-08-26 03:32:42 字數 1512 閱讀 1712

表示式的表示形式有中綴、字首和字尾3中形式。中綴表示式按操作符的優先順序進行計算(後面**實現只包括+、-、*、\,小括號),即數**算。 字尾表示式中只有運算元和操作符。操作符在兩個運算元之後。它的計算規則非常簡單,嚴格按照從左到右的次序依次執行每乙個操作。每遇到乙個操作符,就將前面的兩個數執行相應的操作。

由字尾表示式計算中綴表示式原理:計算機處理字尾表示式求值問題是比較方便的,即將遇到的運算元暫存於乙個運算元棧中,凡是遇到運算元,便從棧中pop出兩個運算元,並將結果存於運算元棧中,直到對字尾表示式中最後乙個運算元處理完,最後壓入棧中的數就是後最表示式的計算結果。

中綴表示式轉換為等價的字尾表示式

中綴表示式不方便與計算機處理,通常要講中綴表示式轉換為乙個與之等價的字尾表示式。等價是指兩個表示式的計算順序和計算結果完全相同。

中綴表示式:0.3/(5*2+1)#

的等價字尾表示式是:0.3 5 2 * 1 + /#

仔細觀察這兩個等價的表示式可知,運算元的出現次序是相同的,但運算子的出現次序是不同的。在字尾表示式中,運算子的出現次序是實際進行操作的次序;在中追表示式中,由於受到操作符的優先順序和括號的影響,操作符出現次序與實際進行操作的次序很可能是不一樣的。

演算法描述:

將中綴表示式轉換為等價的字尾表示式的過程要使用乙個棧放「(」,具體可以按照下面的方式進行。

(1)從左到右依次掃瞄中綴表示式的每乙個字元,如果是數字字元和圓點「.」則直接將它們寫入字尾表示式中。

(2)如果遇到的是開括號「(」,則將它們壓入乙個操作符棧(不需要與棧頂操作符相比較),它表明乙個新的計算層次的開始,在遇到和它匹配的閉括號「)」時,將棧中的元素彈出來並放入字尾表示式中,直到棧頂元素為「(」時,將棧頂元素「(」彈出(不需要加入字尾表示式),表明這一層括號內的操作處理完畢。

(3)如果遇到的是操作符,則將該操作符和操作符棧頂元素比較:

1、當所遇到的操作符的優先順序小於或等於棧頂元素的優先順序時,則取出棧頂元素放入字尾表示式,並彈出該棧頂元素,反覆執行直到當前操作符的優先順序大於棧頂元素的優先順序小於;

2、當所遇到的操作符的優先順序大於棧頂元素的優先順序的時則將它壓入棧中。

(4)重複上述步驟直到遇到中綴表示式的結束符標記「#」,彈出棧中的所有元素並放入字尾表示式中,轉換結束

**如下:

#include#include#include#include#include#include#includeusing namespace std; int pre(char a) //操作符優先順序比較 int main() ope.pop(); //左括號出棧 } else if(pre(str[i]) > pre(ope.top())) //優先順序大於棧頂元素則入棧 ope.push(str[i]); else //小於棧頂元素 ope.push(str[i]); } } while(ope.top() != '=') //其餘操作符存入字尾表示式中 for(start = ans.begin(), end = ans.end(); start < end; ++start) printf("%c", *start); printf("\n"); } return 0; }

字尾表示式 中綴到字尾表示式

輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...

字尾表示式

字尾表示式的計算和中綴表示式轉字尾表示式 此處的運算用的是鍊錶的表示方法 以下為三個會涉及到的標頭檔案 error.h 字尾表示式 created by kyle.yang on 14 12 2.ifndef error h define error h include using namespac...

字尾表示式

對於乙個算術表示式我們的一般寫法是這樣的 3 4 5 6 這中寫法是中序表示式 而後序表示式則是將運算子放在運算元的後面,如 3 4 5 6 可以看出後序表示式中沒有括號,只表達了計算的順序,而這個順序恰好就是計算器中的一般計算順序。建立乙個棧s 從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如...