本篇文章為大家展示了C++中怎么將中綴表達式轉換為后綴表達式,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
湖北網(wǎng)站建設公司創(chuàng)新互聯(lián),湖北網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為湖北上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設要多少錢,請找那個售后服務好的湖北做網(wǎng)站的公司定做!
一、思路:和中綴表達式的計算類似,只不過不用計算,把表達式輸出即可
1.用字符數(shù)組存儲整行輸入的中綴表達式;
2.接著從字符數(shù)組的0位置開始判斷字符,如果是數(shù)字,那就要判斷后面是否是數(shù)字,如果是就不斷掃描組成一個整數(shù)
(暫不考慮負數(shù)和小數(shù)),最終組成一個整數(shù),然后輸出這個數(shù)(因為不用計算,所以直接輸出即可);
3.如果是左括號,直接進符號棧;
4.如果是操作運算符,與符號棧的棧頂元素比較優(yōu)先級:如果高就壓入棧;
低,就取出符號棧頂?shù)脑剌敵觯?/p>
接著,再判斷符號棧頂?shù)脑睾彤斍暗倪\算符號繼續(xù)比較優(yōu)先級,重復前面步驟,直到棧空或者當前的符號優(yōu)先級高;
5.如果是右括號,把符號棧棧頂?shù)脑厝〕觯绻皇亲罄ㄌ枺讶〕龅倪\算符輸出,接著取符號棧棧頂?shù)脑兀钡椒枟V腥〕龅姆柺亲罄ㄌ枺?/p>
6.當掃描完字符數(shù)組時,判斷符號棧是否為空:
不為空,把符號棧棧頂?shù)脑厝〕觯敵龅酱翱冢钡椒枟榭铡?/p>
二、實現(xiàn)程序:
// 中綴表達式轉后綴表達式 // 操作符:+、-、*、/、% // 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n' // 測試數(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)先級 int getPriority(char ch) { int level = 0; // 優(yōu)先級 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]; // 一個一個的讀取表達式,直到遇到'\0' std::stack op; // 棧op:存儲操作符 while(1) { std::cin.getline(arr,250); int len, i; char c; // c存儲從棧中取出的操作符 len = (int)strlen(arr); // strlen()輸出的是:unsigned long類型,所以要強制轉換為int類型 i = 0; while(i < len) { if(isdigit(arr[i])) { // 如果是數(shù)字 num = 0; do { num = num * 10 + (arr[i] - '0'); // ch - 48根據(jù)ASCAII碼,字符與數(shù)字之間的轉換關系 i++; // 下一個字符 }while(isdigit(arr[i])); std::cout << num << " "; } else if(arr[i] == '(') { // (:左括號 op.push(arr[i]); i++; } else if(isOperator(arr[i])) { // 操作符 if(op.empty()) {// 如果棧空,直接壓入棧 op.push(arr[i]); i++; } else { // 比較棧op頂?shù)牟僮鞣cch的優(yōu)先級 // 如果ch的優(yōu)先級高,則直接壓入棧 // 否則,推出棧中的操作符,直到操作符小于ch的優(yōu)先級,或者遇到(,或者棧已空 while(!op.empty()) { c = op.top(); if(getPriority(arr[i]) <= getPriority(c)) { // 優(yōu)先級低或等于 std::cout << c << " "; op.pop(); } else // ch優(yōu)先級高于棧中操作符 break; } // while結束 op.push(arr[i]); // 防止不斷的推出操作符,最后空棧了;或者ch優(yōu)先級高了 i++; } // else } else if(arr[i] == ')') { // 如果是右括號,一直推出棧中操作符,直到遇到左括號( while(op.top() != '(') { std::cout << op.top() << " "; op.pop(); } op.pop(); // 把左括號(推出棧 i++; } else // 如果是空白符,就進行下一個字符的處理 i++; } // 第二個while結束 while(!op.empty()) { // 當棧不空,繼續(xù)輸出操作符 std::cout << op.top() << " "; op.pop(); } std::cout << std::endl; flush(std::cout); } // 第一個while結束 return 0; }
運行結果:
上述內(nèi)容就是C++中怎么將中綴表達式轉換為后綴表達式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當前標題:C++中怎么將中綴表達式轉換為后綴表達式
分享路徑:http://chinadenli.net/article46/gogehg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設計公司、微信公眾號、網(wǎng)站建設、外貿(mào)建站、虛擬主機、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)