字尾表示式求值的演算法實現
阿新 • • 發佈:2019-02-14
字尾表示式編輯
不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則,如:(2 + 1) * 3 , 即2 1 + 3 *
運用字尾表示式進行計算的具體做法:
建立一個棧S 。從左到右讀表示式,如果讀到運算元就將它壓入棧S中,如果讀到n元運算子(即需要引數個數為n的運算子)則取出由棧頂向下的n項按操作符運算,再將運算的結果代替原棧頂的n項,壓入棧S中 。如果字尾表示式未讀完,則重複上面過程,最後輸出棧頂的數值則為結束。
程式碼:
#include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct Node//棧結構體 { float data; struct Node* next; }; typedef struct Node* Stack; typedef struct Node* Position; Stack CreateStack()//建立棧 { Position s; s = (Position)malloc(sizeof(Node)); s->next = NULL; return s; } int IsEmpty(Stack s)//判斷棧是否為空 { return s->next == NULL; } void Pop(Stack s)//彈出棧 { if (s->next != NULL) { Position first; first = s->next; s->next = s->next->next; free(first); } } void Push(float x, Stack s)//壓入棧 { Position tempCell = (Position)malloc(sizeof(Node)); tempCell->data = x; tempCell->next = s->next; s->next = tempCell; } float Top(Stack s)//檢視棧頂元素 { return s->next->data; } int main() { Stack s = CreateStack(); char str[1000]; int flag = 0; while (scanf("%s", str) != EOF) { float f; if (f=atof(str)) { Push(f, s); } else { char ch = str[0]; float a, b,c; if (!IsEmpty(s)) { a = Top(s); Pop(s); } else { flag = 1; break; } if (!IsEmpty(s)) { b = Top(s); Pop(s); } else { flag = 1; break; } switch (ch) { case '+': c = a + b; break; case '-': c = a - b; break; case '/': c = a / b; break; case '*': c = a * b; break; } Push(c, s); } } if (flag == 0) { printf("%.2f\n", s->next->data); } else { printf("ERROR\n"); } }