欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

 更新時(shí)間:2020年04月26日 14:23:10   作者:ChanJose  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的具體代碼,供大家參考,具體內(nèi)容如下

一、思路:和中綴表達(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 <iostream>
#include <stack>
 
// 判斷是否是操作符
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<char> 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é)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++函數(shù)指針和回調(diào)函數(shù)示例

    c++函數(shù)指針和回調(diào)函數(shù)示例

    這篇文章主要介紹了c++函數(shù)指針和回調(diào)函數(shù)示例,需要的朋友可以參考下
    2014-05-05
  • C語(yǔ)言與Lua之間的相互調(diào)用詳解

    C語(yǔ)言與Lua之間的相互調(diào)用詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言與Lua之間的相互調(diào)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • C++利用Socket實(shí)現(xiàn)主機(jī)間的UDP/TCP通信

    C++利用Socket實(shí)現(xiàn)主機(jī)間的UDP/TCP通信

    這篇文章主要為大家詳細(xì)介紹了C++如何利用Socket實(shí)現(xiàn)主機(jī)間的UDP/TCP通信功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • 快速掌握VC6.0中各種宏注釋?xiě)?yīng)用(附圖)

    快速掌握VC6.0中各種宏注釋?xiě)?yīng)用(附圖)

    為了方便別人或自己閱讀自己的程序,注釋是堅(jiān)決不可少的,一個(gè)漂亮的程序,不是在于你應(yīng)用的技術(shù)多么高深,而是能夠把高深的技術(shù)描述的清楚易懂
    2013-01-01
  • C語(yǔ)言中對(duì)文件最基本的讀取和寫(xiě)入函數(shù)

    C語(yǔ)言中對(duì)文件最基本的讀取和寫(xiě)入函數(shù)

    這篇文章主要介紹了C語(yǔ)言中對(duì)文件最基本的讀取和寫(xiě)入函數(shù),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • Qt重寫(xiě)QStackedWidget模擬實(shí)現(xiàn)home界面滑動(dòng)效果

    Qt重寫(xiě)QStackedWidget模擬實(shí)現(xiàn)home界面滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Qt如何通過(guò)重寫(xiě)QStackedWidget模擬實(shí)現(xiàn)home界面滑動(dòng)效果,文中的實(shí)現(xiàn)過(guò)程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C++ string替換指定字符實(shí)例代碼

    C++ string替換指定字符實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于C++ string替換指定字符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C語(yǔ)言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    C語(yǔ)言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中數(shù)據(jù)在內(nèi)存中存儲(chǔ)解析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • Matlab繪制散點(diǎn)密度圖的教程詳解

    Matlab繪制散點(diǎn)密度圖的教程詳解

    這篇文章主要介紹了如何使用MATLAB繪制散點(diǎn)密度圖(二維核密度),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • C語(yǔ)言中qsort函數(shù)的用法實(shí)例詳解

    C語(yǔ)言中qsort函數(shù)的用法實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)的用法實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評(píng)論