<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
什麼是中綴表示式,什麼是字尾表示式?
從小學開始學習的四則運算,例如:3+(5*(2+3)+7) 類似這種表示式就是中綴表示式。中綴表示式人腦很容易理解,各個算符的優先順序,人腦也很容易判斷,先算括弧裡的,再算*,再算+,-
但是這種表示式很不利於計算機計算,通過某種方式把字首表示式轉換為字尾表示式方便計算機進行計算,如3+(5*(2+3)+7)的字尾表示式就是3,5,2,3,+,*,7,+, +。這個表示式計算機很容易計算,為什麼容易計算,通過演演算法流程2,就會一個深入的理解。
如何把中綴表示式轉換成字尾表示式?比如說3+(5*(2+3)+7)的轉成字尾表示式的流程如何?
操作符優先順序:
左括號和右括號作為特殊操作符特殊處理。(碰到’(’不用判斷優先順序直接入操作符棧,碰到’)’,也不用判斷優先順序,直接出操作符棧)
大致演演算法掌握以下幾個流程:
準備兩個棧,一個是數位棧A,一個是操作符棧(+,-,*,/(,))B等
1.0 對於數位棧A,遇到數位直接入棧A。
2.0 對於操作符棧B,分幾種情況
2.1 碰到 ‘(‘操作符直接入棧
2.2 碰到 ‘)’操作符,不停的把操作符棧B出棧,直到遇到’)’。(把’(’到’)’之間的彈出的操作符依次入棧A)
2.3 碰到’+,-,* /’比較當前元素(假設當前元素current)和B棧棧頂的操作符(假設棧頂元素是top)的優先順序.
2.3.1 如果top >= current, B棧出棧且迴圈比較,直到top < current退出迴圈,且把 current入棧
2.3.2 如果top < current, 直接把current入B棧
3.0 掃描完整個字串,如果B棧中還有操作符,依次出棧入A
按照上面演演算法演示3+(5*(2+3)+7)的流程:
1,碰到3,3入A棧 [3,]
2,碰到+,入B棧 [+,]
3,碰到(,入B棧 [+,(]
4,碰到5,入A棧 [3,5]
5,碰到*,*的優先順序大於 (,入B棧[ +,(,*]
6,碰到(,入B棧[ +,(,*,(]
7,碰到2,入A棧 [3,5,2]
8,碰到+,入B棧[ +,(,*,(,+]
9,碰到3,入A棧 [3,5,2,3]
10,碰到),彈出B棧,直接到 ‘(‘,把彈出的操作符入A棧。B:[ +,(,*] A:[3,5,2,3,+]
11,碰到+, +的優先順序小於B的棧頂元素 *,所以*從B出棧,入A,並把+入B。B:[ +,(,+] A:[3,5,2,3,+,*]
12,碰到7,入A棧 [3,5,2,3,+,*,7]
13,碰到),彈出B棧,直接到 ‘(‘,把彈出的操作符入A棧。B:[ +] A:[3,5,2,3,+,*,7,+]
14, 掃描完整個字串,判斷B是否為空,不為空把B棧的元素彈出,入A。當前不為空,所以最終A棧的元素為 A:[3,5,2,3,+,*,7,+, +]
所以最終A的字尾表示式是3,5,2,3,+,*,7,+, +
計算機拿到這個會怎麼計算呢?流程如下:
通過步驟1,2迴圈計算,最終棧裡只會有一個元素,這個就是表示式的結果。
我們來演練一下:
1,碰到數位3,5,2,3直接入棧A[3,5,2,3]
2,碰到+,彈出棧頂2,3,相加得5 入棧A[3,5,5]
3,碰到*,彈出棧頂5,5,相乘得25 入棧A[3,25]
4,碰到7,直接入棧A[3,25,7]
5,碰到+,彈出棧頂25,7,相加得32 入棧A[3,32]
6,碰到+,彈出棧頂3,32,相加得35 入棧A[35]
通過上面可以得知,計算機很容易計算,從左掃描到右就能把結果得出。
mid2post 求字尾表示式
calcPostExp 拿到字尾表示式求值
cmpPriority 優先順序比較
//優先順序 bool cmpPriority(char top, char cur)//比較當前字元與棧頂字元的優先順序,若棧頂高,返回true { if ((top == '+' || top == '-') && (cur == '+' || cur == '-')) return true; if ((top == '*' || top == '/') && (cur == '+' || cur == '-' || top == '*' || top == '/')) return true; if (cur == ')') return true; return false; }
求字尾表示式求值
vector<string> mid2post(string &str) { vector<string>vstr; stack<char>cstack; for (int i = 0;i<str.size();++i)//掃描字串 { string temp = ""; if (str[i] >= '0' && str[i] <= '9')//若是數位 { temp += str[i]; while (i + 1<str.size() && str[i + 1] >= '0' && str[i + 1] <= '9') { temp += str[i + 1];//若是連續數位 ++i; } vstr.push_back(temp); } else if (cstack.empty() || str[i] == '(')//若棧空或者字元為'(' cstack.push(str[i]); else if (cmpPriority(cstack.top(), str[i]))//若棧頂元素優先順序較高,棧頂元素出棧 { if (str[i] == ')')//若當前字元是右括號,棧中元素出棧,入字串陣列中,直到遇到'(' { while (!cstack.empty() && cstack.top() != '(') { temp += cstack.top(); cstack.pop(); vstr.push_back(temp); temp = ""; } cstack.pop(); } else//棧中優先順序高的元素出棧,入字串陣列,直到優先順序低於當前字元 { while (!cstack.empty() && cmpPriority(cstack.top(), str[i])) { temp += cstack.top(); cstack.pop(); vstr.push_back(temp); temp = ""; } cstack.push(str[i]); } } else//當前字元優先順序高於棧頂元素,直接入棧 cstack.push(str[i]); } while (!cstack.empty())//棧中還存在運運算元時,出棧,存入字串陣列 { string temp = ""; temp += cstack.top(); cstack.pop(); vstr.push_back(temp); } return vstr; }
對字尾表示式進行求值,主要是根據運運算元取出兩
int calcPostExp(vector<string> & vstr)//對字尾表示式進行求值,主要是根據運運算元取出兩個運算元進行運算 { int num, op1, op2; stack<int>opstack; for (int i = 0;i<vstr.size();++i) { string temp = vstr[i]; if (temp[0] >= '0' && temp[0] <= '9')//如果當前字串是數位,利用字串流轉化為int型 { stringstream ss; ss << temp; ss >> num; opstack.push(num); } else if (vstr[i] == "+")//若是操作符,取出兩個運算元,進行運算,並將結果存入 { op2 = opstack.top(); opstack.pop(); op1 = opstack.top(); opstack.pop(); opstack.push(op1 + op2); } else if (vstr[i] == "-") { op2 = opstack.top(); opstack.pop(); op1 = opstack.top(); opstack.pop(); opstack.push(op1 - op2); } else if (vstr[i] == "*") { op2 = opstack.top(); opstack.pop(); op1 = opstack.top(); opstack.pop(); opstack.push(op1*op2); } else if (vstr[i] == "/") { op2 = opstack.top(); opstack.pop(); op1 = opstack.top(); opstack.pop(); opstack.push(op1 / op2); } } return opstack.top();//最終的棧頂元素就是求解的結果 }
到此這篇關於詳解Java中綴表示式的實現的文章就介紹到這了,更多相關Java中綴表示式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45