計算機(尾碼運算式)

來源:互聯網
上載者:User

不過目前這個功能太少,而且能算的十分有限,

測試輸入為

4+4*5+3=

測試輸出為
4 4 5 * + 3 +=27

主要就是瞭解一下怎麼把中綴運算式轉化成尾碼運算式,然後再利用尾碼運算式求值,我後續會完善這個程式,做個真正意義上的計算機。。o(∩_∩)o

轉化步驟我搜尋了一下,大致如下:

將中綴運算式轉換為等價的尾碼運算式的過程要使用一個棧放“(”,具體可以按照下面的方式進行。 

(1)從左至右依次掃描中綴運算式的每一個字元,如果是數字字元和圓點“.”則直接將它們寫入尾碼運算式中。 

(2)如果遇到的是開括弧“(”,則將它們壓入一個操作符棧(不需要與棧頂操作符相比較),它表明一個新的計算層次的開始,在遇到和它匹配的閉括弧“)”時,將棧中的元素彈出來並放入尾碼運算式中,直到棧頂元素為“(”時,將棧頂元素“(”彈出(不需要加入尾碼運算式),表明這一層括弧內的操作處理完畢。 

(3)如果遇到的是操作符,則將該操作符和操作符棧頂元素比較: 

    1、當所遇到的操作符的優先順序小於或等於棧頂元素的優先順序時,則取 出棧頂元素放入尾碼運算式,並彈出該棧頂元素,反覆執行直到當前操作符的優先順序大於棧頂元素的優先順序小於;

     2、當所遇到的操作符的優先順序大於棧頂元素的優先順序的時則將它壓入棧中。 


(4)重複上述步驟直到遇到中綴運算式的結束符標記“#”,彈出棧中的所有元素並放入尾碼運算式中,轉換結束

#include<iostream>#include "stack.h"#include "deque.h"bool order[48][48];void initial();void judge(char);bool issym(char);int calculate();deque<char>expression;stack<char>symbol;stack<int>number;int main(){initial();using namespace std;char ch;while (cin>>ch && ch!='@'){if(ch=='='){while (!symbol.empty()){expression.push_back(symbol.top());symbol.pop();}expression.show();cout<<"="<<calculate()<<endl;while(!symbol.empty())symbol.pop();while(!expression.empty())expression.pop_back();continue;}if(issym(ch))judge(ch);else {expression.push_back(ch);number.push(ch-'0');}}return 0;}void initial(){order['+']['+']=order['-']['-']=order['*']['*']=order['/']['/']=true;order['*']['+']=order['*']['-']=order['*']['/']=true;order['/']['+']=order['/']['-']=order['/']['*']=true;order['+']['*']=order['+']['/']=false,order['+']['-']=true;order['-']['*']=order['-']['/']=false,order['-']['+']=true;}void judge(char s){if(symbol.empty())symbol.push(s);else{if(order[s][symbol.top()])symbol.push(s);else {while(!symbol.empty() && order[symbol.top()][s]){expression.push_back(symbol.top());symbol.pop();}symbol.push(s);}}}bool issym(char s){if(s=='+' || s=='-' || s=='*' || s=='/')return true;return false;}int calculate(){stack<int>num;stack<char>exp;while(!expression.empty()){char ch=expression.front();expression.pop_front();if(issym(ch)){int a=num.top();num.pop();int b=num.top();num.pop();switch(ch){case '+':num.push(a+b);break;case '-':num.push(a-b);break;case '*':num.push(a*b);break;case '/':num.push(a/b);break;}}elsenum.push(ch-'0');}return  num.top();}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.