資料結構-四則表示式運算
阿新 • • 發佈:2021-06-30
//四則運算 //xxg #pragma once #include<iostream> using namespace std; typedef struct numNode{//數字棧 char data; struct numNode* next; }numNode,*numListStack; typedef struct opNode { char data; struct opNode* next; }opNode,*opListStack; class c17 { private: numListStack pushnum(numListStack num,char data) { numNode* p = new numNode; p->data = data; p->next = num; num = p; return num; } numListStack popnum(numListStack num ,char &numdata) { if (num != NULL) { numdata = num->data; numNode *p = new numNode; p = num; num = num->next; delete p; return num; } } opListStack pushop(opListStack op,char data) { opNode *p = new opNode; p->data = data; p->next = op; op = p; return op; } opListStack popop(opListStack op, char& numdata) { if (op != NULL) { numdata = op->data; opNode* p = new opNode; p = op; op = op->next; delete p; return op; } } int youxianji(char a) { if (a == '+') { return 2; } if (a == '-') { return 1; } if (a == '*') { return 3; } if (a == '/') { return 3; } } int yunsuan(char a, char b, char op) { int zuo = a - '0'; int you = b - '0'; if (op == '+') { cout << zuo + you; return zuo + you; } if (op == '-') { return zuo - you; } if (op == '*') { return zuo * you; } if (op == '/') { return zuo / you; } } public: void main1() { char a[100];/*輸入的表示式*/ char a1[100];/*字尾表示式*/ int i = 0,length; numListStack numLS = NULL; opListStack opLS = NULL; cout << "請輸入正確且有意義的算術表示式:" << endl; cout << "按#鍵退出輸入" << endl; cout << "請嚴格按照一個字元一個空格間隔輸入,按空格結束" << endl; while (i < 100) { cin >> a[i++]; if (cin.get() == '\n') break; } length = i; for (int i = 0; i < length; i++) { /*cout << a[i];*/ } for (int j = 0; j < length; j++) { /* if (a[j] >= '0' && a[j] <= '9') { cout << endl << a[j] << endl; numLS = pushnum(numLS, a[j]); } else { opLS = pushop(opLS, a[j]); }*/ } cout << "字尾表示式為:" << endl; int j = 0; coutreoder(opLS, a, length, a1,j); cout << endl << "儲存的字尾表示式陣列為:" << endl;; for (int k = 0; k < j; k++) { cout << a1[k] <<" "; } cout <<endl<< "計算結果為:" << endl; sum(numLS, a1, j); } //輸出字尾表示式 void coutreoder(opListStack op,char arr[],int length,char arr1[],int &j) { for (int i = 0; i < length; i++) {//遍歷輸入的表示式,陣列直接輸出,運算子壓棧比較優先順序後輸出 if (arr[i] >= '1' && arr[i] <= '9') { cout << arr[i] << " "; arr1[j] = arr[i];/*將數字存入陣列*/ j++; }else{ if (op == NULL) {/*操作符棧為空直接壓入*/ op = pushop(op, arr[i]); } else { //判斷運算子優先順序 int a = youxianji(arr[i]);//入棧優先順序 int b = youxianji(op->data);//棧內優先順序 if (arr[i] == '(' || arr[i] == ')') { continue; } if (arr[i] == '#') {/*遇到#全部彈出*/ while (op != NULL) { char data; op = popop(op, data); arr1[j] = data; j++; cout << data; } } else { while (a <= b) {/*直到遇到優先順序比較低的否則全部彈出*/ char data; op = popop(op, data); arr1[j] = data; j++; cout << data; a = youxianji(arr[i]);//入棧優先順序 if(op!=NULL)/*空棧直接退出*/ b = youxianji(op->data);//棧內優先順序 else { break; } } /*直接壓入*/ op = pushop(op, arr[i]); } } } } } //計算結果 void sum(numListStack num, char arr[], int length) { arr[length] = '#'; for (int i = 0; i < length+1; i++) { if (arr[i]>='0'&&arr[i]<='9') { num = pushnum(num, arr[i]); continue; } if (arr[i] == '#') { char data3; num = popnum(num, data3); int data = data3 - '0'; cout << data; } else { char a; char b; num = popnum(num, a); num = popnum(num, b); char sum = yunsuan(a, b, arr[i]) + '0'; num = pushnum(num, sum); } } } };