利用棧實現逆波蘭演算法
阿新 • • 發佈:2019-02-08
1.逆波蘭表示式?
在我們的普遍認知中,計算的優先順序總是和()相關,形如(1+2)*(3+4)這樣的式子,我們看起來十分的清晰明瞭,但對計算機來說,它會進行很多次的判斷來確定一個運算的優先順序。於是在很久很久之前就有一個人發現,如果我們將上述算式寫成形如1 2 + 3 4 + *的形式,計算機判斷起來會顯得格外的快,效率也會更高,然而它的實現原理是什麼樣的呢。
2.演算法分析
經過觀察,我們發現該算式將引數放在前面,運算操作符放在兩個要進行計算的引數之後,我們可以得出這樣的思路:每次我們將拿到的資料壓棧,當遇見運算子時,就彈出兩個資料讓他們進行相應的計算,這樣,計算完成之後我們再將運算結果入棧,最後我們拿到最終結果!
程式例項:
#include<iostream> using namespace std; typedef char Element; struct Node { Element data; Node *next; Node(Element d) :data(d), next(NULL) {} }; class DStack { private: Node *top; int size; public: DStack() : top(NULL) { } ~DStack() { if (top != NULL) { Node *del = top; top = top->next; delete del; del = NULL; } } public: void Push(Element d) { Node *newNode = new Node(d); newNode->next = top; top = newNode; size++; } Element Pop() { Element re = top->data; top = top->next; size--; return re; } }; int RPN() { DStack s1; char tmp = 0; int a = 0, b = 0, c = 0; cout << "please enter a RPN :" << endl; while (1) { cin >> tmp; if (tmp == '#') break; switch (tmp) { case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': s1.Push(tmp); break; case'+': a = s1.Pop()-'0'; b = s1.Pop() - '0'; c = a + b; s1.Push(c + '0'); break; case'-': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a - b; s1.Push(c + '0'); break; case'*': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a * b; s1.Push(c + '0'); break; case'/': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a / b; s1.Push(c + '0'); break; default: exit(0); break; } } int re = s1.Pop() - '0'; return re; } int main() { int a = RPN(); cout << "計算結果是:" << a << endl; getchar(); getchar(); return 0; }
綜上,我們選擇使用switch case控制流機制來實現我們的資料判斷使程式顯得簡潔明瞭。