1.逆波蘭表達式? ios
在咱們的廣泛認知中,計算的優先級老是和()相關,形如(1+2)*(3+4)這樣的式子,咱們看起來十分的清晰明瞭,但對計算機來講,它會進行不少次的判斷來肯定一個運算的優先級。因而在好久好久以前就有一我的發現,若是咱們將上述算式寫成形如1 2 + 3 4 + *的形式,計算機判斷起來會顯得格外的快,效率也會更高,然而它的實現原理是什麼樣的呢。算法
2.算法分析ide
通過觀察,咱們發現該算式將參數放在前面,運算操做符放在兩個要進行計算的參數以後,咱們能夠得出這樣的思路:每次咱們將拿到的數據壓棧,當碰見運算符時,就彈出兩個數據讓他們進行相應的計算,這樣,計算完成以後咱們再將運算結果入棧,最後咱們拿到最終結果!
spa
程序實例:ci
#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控制流機制來實現咱們的數據判斷使程序顯得簡潔明瞭。get