這篇文章主要講解了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
十余年的阿克陶網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整阿克陶建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“阿克陶網(wǎng)站設(shè)計(jì)”,“阿克陶網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一、思路:和中綴表達(dá)式的計(jì)算類(lèi)似,只不過(guò)不用計(jì)算,把表達(dá)式輸出即可
1.用字符數(shù)組存儲(chǔ)整行輸入的中綴表達(dá)式;
2.接著從字符數(shù)組的0位置開(kāi)始判斷字符,如果是數(shù)字,那就要判斷后面是否是數(shù)字,如果是就不斷掃描組成一個(gè)整數(shù)
(暫不考慮負(fù)數(shù)和小數(shù)),最終組成一個(gè)整數(shù),然后輸出這個(gè)數(shù)(因?yàn)椴挥糜?jì)算,所以直接輸出即可);
3.如果是左括號(hào),直接進(jìn)符號(hào)棧;
4.如果是操作運(yùn)算符,與符號(hào)棧的棧頂元素比較優(yōu)先級(jí):如果高就壓入棧;
低,就取出符號(hào)棧頂?shù)脑剌敵觯?/p>
接著,再判斷符號(hào)棧頂?shù)脑睾彤?dāng)前的運(yùn)算符號(hào)繼續(xù)比較優(yōu)先級(jí),重復(fù)前面步驟,直到??栈蛘弋?dāng)前的符號(hào)優(yōu)先級(jí)高;
5.如果是右括號(hào),把符號(hào)棧棧頂?shù)脑厝〕?,如果不是左括?hào),把取出的運(yùn)算符輸出,接著取符號(hào)棧棧頂?shù)脑?,直到符?hào)棧中取出的符號(hào)是左括號(hào);
6.當(dāng)掃描完字符數(shù)組時(shí),判斷符號(hào)棧是否為空:
不為空,把符號(hào)棧棧頂?shù)脑厝〕?,輸出到窗口,直到符?hào)棧為空。
二、實(shí)現(xiàn)程序:
// 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式 // 操作符:+、-、*、/、% // 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n' // 測(cè)試數(shù)據(jù):輸入格式:(注意:不能有中文的操作符) // 2+(3+4)*5 // 16+2*30/4 // 輸出格式: // 2 3 4 + 5 * + // 16 2 30 * 4 / + #include#include // 判斷是否是操作符 bool isOperator(char ch) { if(ch == '+' || ch == '-' || ch == '*' || ch == '/') return true; return false; // 否則返回false } // 獲取優(yōu)先級(jí) int getPriority(char ch) { int level = 0; // 優(yōu)先級(jí) switch(ch) { case '(': level = 1; break; case '+': case '-': level = 2; break; case '*': case '/': level = 3; break; default: break; } return level; } int main(int argc, const char * argv[]) { // insert code here... int num; char arr[250]; // 一個(gè)一個(gè)的讀取表達(dá)式,直到遇到'\0' std::stack op; // 棧op:存儲(chǔ)操作符 while(1) { std::cin.getline(arr,250); int len, i; char c; // c存儲(chǔ)從棧中取出的操作符 len = (int)strlen(arr); // strlen()輸出的是:unsigned long類(lèi)型,所以要強(qiáng)制轉(zhuǎn)換為int類(lèi)型 i = 0; while(i < len) { if(isdigit(arr[i])) { // 如果是數(shù)字 num = 0; do { num = num * 10 + (arr[i] - '0'); // ch - 48根據(jù)ASCAII碼,字符與數(shù)字之間的轉(zhuǎn)換關(guān)系 i++; // 下一個(gè)字符 }while(isdigit(arr[i])); std::cout << num << " "; } else if(arr[i] == '(') { // (:左括號(hào) op.push(arr[i]); i++; } else if(isOperator(arr[i])) { // 操作符 if(op.empty()) {// 如果???,直接壓入棧 op.push(arr[i]); i++; } else { // 比較棧op頂?shù)牟僮鞣cch的優(yōu)先級(jí) // 如果ch的優(yōu)先級(jí)高,則直接壓入棧 // 否則,推出棧中的操作符,直到操作符小于ch的優(yōu)先級(jí),或者遇到(,或者棧已空 while(!op.empty()) { c = op.top(); if(getPriority(arr[i]) <= getPriority(c)) { // 優(yōu)先級(jí)低或等于 std::cout << c << " "; op.pop(); } else // ch優(yōu)先級(jí)高于棧中操作符 break; } // while結(jié)束 op.push(arr[i]); // 防止不斷的推出操作符,最后空棧了;或者ch優(yōu)先級(jí)高了 i++; } // else } else if(arr[i] == ')') { // 如果是右括號(hào),一直推出棧中操作符,直到遇到左括號(hào)( while(op.top() != '(') { std::cout << op.top() << " "; op.pop(); } op.pop(); // 把左括號(hào)(推出棧 i++; } else // 如果是空白符,就進(jìn)行下一個(gè)字符的處理 i++; } // 第二個(gè)while結(jié)束 while(!op.empty()) { // 當(dāng)棧不空,繼續(xù)輸出操作符 std::cout << op.top() << " "; op.pop(); } std::cout << std::endl; flush(std::cout); } // 第一個(gè)while結(jié)束 return 0; }
運(yùn)行結(jié)果:
看完上述內(nèi)容,是不是對(duì)C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。