C++實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法-創(chuàng)新互聯(lián)

這篇文章主要講解了C++實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

站在用戶的角度思考問題,與客戶深入溝通,找到樂亭網(wǎng)站設(shè)計與樂亭網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋樂亭地區(qū)。

一、思路:和中綴表達(dá)式的計算類似,只不過不用計算,把表達(dá)式輸出即可

1.用字符數(shù)組存儲整行輸入的中綴表達(dá)式;

2.接著從字符數(shù)組的0位置開始判斷字符,如果是數(shù)字,那就要判斷后面是否是數(shù)字,如果是就不斷掃描組成一個整數(shù)

(暫不考慮負(fù)數(shù)和小數(shù)),最終組成一個整數(shù),然后輸出這個數(shù)(因為不用計算,所以直接輸出即可);

3.如果是左括號,直接進(jìn)符號棧;

4.如果是操作運算符,與符號棧的棧頂元素比較優(yōu)先級:如果高就壓入棧;

低,就取出符號棧頂?shù)脑剌敵觯?/p>

接著,再判斷符號棧頂?shù)脑睾彤?dāng)前的運算符號繼續(xù)比較優(yōu)先級,重復(fù)前面步驟,直到??栈蛘弋?dāng)前的符號優(yōu)先級高;

5.如果是右括號,把符號棧棧頂?shù)脑厝〕?,如果不是左括號,把取出的運算符輸出,接著取符號棧棧頂?shù)脑?,直到符號棧中取出的符號是左括號?/p>

6.當(dāng)掃描完字符數(shù)組時,判斷符號棧是否為空:

不為空,把符號棧棧頂?shù)脑厝〕?,輸出到窗口,直到符號棧為空?/p>

二、實現(xiàn)程序:

// 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
// 操作符:+、-、*、/、%
// 輸入:可以用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 <iostream>
#include <stack>
 
// 判斷是否是操作符
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]; // 一個一個的讀取表達(dá)式,直到遇到'\0'
  std::stack<char> op; // 棧op:存儲操作符
  
  while(1) {
    std::cin.getline(arr,250);
    int len, i;
    char c; // c存儲從棧中取出的操作符
    
    len = (int)strlen(arr); // strlen()輸出的是:unsigned long類型,所以要強(qiáng)制轉(zhuǎn)換為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ù)字之間的轉(zhuǎn)換關(guān)系
          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結(jié)束
          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 // 如果是空白符,就進(jìn)行下一個字符的處理
        i++;
    } // 第二個while結(jié)束
    while(!op.empty()) { // 當(dāng)棧不空,繼續(xù)輸出操作符
      std::cout << op.top() << " ";
      op.pop();
    }
    std::cout << std::endl;
    flush(std::cout);
  } // 第一個while結(jié)束
  return 0;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標(biāo)題:C++實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article40/dphceo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、ChatGPT、企業(yè)建站、網(wǎng)站排名、網(wǎng)站改版、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計