表示式的表示形式有中綴、字首和字尾3中形式。中綴表示式按操作符的優先順序進行計算(後面**實現只包括+、-、*、\,小括號),即數**算。 字尾表示式中只有運算元和操作符。操作符在兩個運算元之後。它的計算規則非常簡單,嚴格按照從左到右的次序依次執行每乙個操作。每遇到乙個操作符,就將前面的兩個數執行相應的操作。
由字尾表示式計算中綴表示式原理:計算機處理字尾表示式求值問題是比較方便的,即將遇到的運算元暫存於乙個運算元棧中,凡是遇到運算元,便從棧中pop出兩個運算元,並將結果存於運算元棧中,直到對字尾表示式中最後乙個運算元處理完,最後壓入棧中的數就是後最表示式的計算結果。
中綴表示式轉換為等價的字尾表示式
中綴表示式不方便與計算機處理,通常要講中綴表示式轉換為乙個與之等價的字尾表示式。等價是指兩個表示式的計算順序和計算結果完全相同。
中綴表示式:0.3/(5*2+1)#
的等價字尾表示式是:0.3 5 2 * 1 + /#
仔細觀察這兩個等價的表示式可知,運算元的出現次序是相同的,但運算子的出現次序是不同的。在字尾表示式中,運算子的出現次序是實際進行操作的次序;在中追表示式中,由於受到操作符的優先順序和括號的影響,操作符出現次序與實際進行操作的次序很可能是不一樣的。
演算法描述:
將中綴表示式轉換為等價的字尾表示式的過程要使用乙個棧放「(」,具體可以按照下面的方式進行。
(1)從左到右依次掃瞄中綴表示式的每乙個字元,如果是數字字元和圓點「.」則直接將它們寫入字尾表示式中。
(2)如果遇到的是開括號「(」,則將它們壓入乙個操作符棧(不需要與棧頂操作符相比較),它表明乙個新的計算層次的開始,在遇到和它匹配的閉括號「)」時,將棧中的元素彈出來並放入字尾表示式中,直到棧頂元素為「(」時,將棧頂元素「(」彈出(不需要加入字尾表示式),表明這一層括號內的操作處理完畢。
(3)如果遇到的是操作符,則將該操作符和操作符棧頂元素比較:
1、當所遇到的操作符的優先順序小於或等於棧頂元素的優先順序時,則取 出棧頂元素放入字尾表示式,並彈出該棧頂元素,反覆執行直到當前操作符的優先順序大於棧頂元素的優先順序小於;
2、當所遇到的操作符的優先順序大於棧頂元素的優先順序的時則將它壓入棧中。
(4)重複上述步驟直到遇到中綴表示式的結束符標記「#」,彈出棧中的所有元素並放入字尾表示式中,轉換結束
**如下:
[cpp]view plain
copy
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
intpre(
char
a) //操作符優先順序比較
intmain()
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;
}
超級詳解中綴表示式與字尾表示式
首先我們應該知道我們平常所列的式子如2 3 5 這樣的式子就稱為中綴表示式。這個式子的字尾表示式是這樣的 235 之所以這樣做,是因為字尾表示式更容易讓計算機讀懂,而中綴表示式更符合我們自己的理解。在這裡很多文章和書都會直接告訴你如何進行轉化,相信大家也都看的頭暈目眩。而我認為,想理解如何實現,我們...
字尾表示式 中綴到字尾表示式
輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...
字首 中綴 字尾表示式詳解
部落格說明 介紹字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同 字首表示式 字首表示式的運算子位於運算元之前 計算方式 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧...