91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中怎么將中綴表達式轉換為后綴表達式

發布時間:2021-08-10 15:18:23 來源:億速云 閱讀:281 作者:Leah 欄目:建站服務器

本篇文章為大家展示了C++中怎么將中綴表達式轉換為后綴表達式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

1.用字符數組存儲整行輸入的中綴表達式;

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

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

3.如果是左括號,直接進符號棧;

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

低,就取出符號棧頂的元素輸出;

接著,再判斷符號棧頂的元素和當前的運算符號繼續比較優先級,重復前面步驟,直到棧空或者當前的符號優先級高;

5.如果是右括號,把符號棧棧頂的元素取出,如果不是左括號,把取出的運算符輸出,接著取符號棧棧頂的元素,直到符號棧中取出的符號是左括號;

6.當掃描完字符數組時,判斷符號棧是否為空:

不為空,把符號棧棧頂的元素取出,輸出到窗口,直到符號棧為空。

二、實現程序:

 // 中綴表達式轉后綴表達式
// 操作符:+、-、*、/、%
// 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'
// 測試數據:輸入格式:(注意:不能有中文的操作符)
//      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
}
  
// 獲取優先級
int getPriority(char ch) {
  int level = 0; // 優先級
   
  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])) { // 如果是數字
        num = 0;
        do {
          num = num * 10 + (arr[i] - '0'); // ch - 48根據ASCAII碼,字符與數字之間的轉換關系
          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頂的操作符與ch的優先級
          // 如果ch的優先級高,則直接壓入棧
          // 否則,推出棧中的操作符,直到操作符小于ch的優先級,或者遇到(,或者棧已空
          while(!op.empty()) {
            c = op.top();
            if(getPriority(arr[i]) <= getPriority(c)) {
              // 優先級低或等于
              std::cout << c << " ";
              op.pop();
            } else // ch優先級高于棧中操作符
              break;
          } // while結束
          op.push(arr[i]); // 防止不斷的推出操作符,最后空棧了;或者ch優先級高了
          i++;
        } // else
      } else if(arr[i] == ')') { // 如果是右括號,一直推出棧中操作符,直到遇到左括號(
        while(op.top() != '(') {
          std::cout << op.top() << " ";
          op.pop();
        }
        op.pop(); // 把左括號(推出棧
        i++;
      } else // 如果是空白符,就進行下一個字符的處理
        i++;
    } // 第二個while結束
    while(!op.empty()) { // 當棧不空,繼續輸出操作符
      std::cout << op.top() << " ";
      op.pop();
    }
    std::cout << std::endl;
    flush(std::cout);
  } // 第一個while結束
  return 0;
}

運行結果:
C++中怎么將中綴表達式轉換為后綴表達式

上述內容就是C++中怎么將中綴表達式轉換為后綴表達式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

宜州市| 金堂县| 博罗县| 白山市| 泌阳县| 渝北区| 于都县| 卢龙县| 巩留县| 广水市| 库伦旗| 日喀则市| 宿迁市| 静宁县| 凌海市| 兴海县| 临安市| 东方市| SHOW| 肥城市| 鸡西市| 商河县| 成都市| 隆昌县| 棋牌| 康保县| 顺平县| 晋城| 唐海县| 墨江| 乃东县| 大关县| 岐山县| 江北区| 尉氏县| 铜山县| 新源县| 德江县| 翁源县| 康保县| 德兴市|