中綴表示式求解四則運算

2021-08-19 08:57:34 字數 3101 閱讀 9109

功能實現

四則運算中包含:括號、加減、乘除、小數點

樣例輸入:12.5-(8-3/2)*3+5

樣例輸出:-2

邏輯整理

建立兩個棧,分別用來儲存數字型別和操作符型別。

依次讀入每個字元,直至所有字元均遍歷完畢

判斷當前字元s是數字還是操作符

數字:由於數字的位數以及小數點情況均不確定,因此需要從當前字元的位置迴圈,直至下乙個是操作符的字元停止執行,將整個連續的數字字元拼接成乙個數字型別變數sum,這裡使用float,然後將該變數sum入數字棧。

字元:判斷字元棧是否為空

空棧:直接入字元棧

非空棧:取棧頂操作符,記為no。

判斷當前操作符s與棧頂操作符no的優先順序順序。具體優先順序從高到低依次如下所列:() -> */ -> +-。

若s優先順序高於no,那麼有兩種情況:

1.s為右括號')'。

(1)操作符棧頂操作符出棧->數字棧出棧兩次分別記為n1,n2->根據no對n1和n2進行計算->將計算結果入數字棧->讀取當前操作符棧頂操作符並賦值給no

(2)迴圈第(1)步操作直至no=='('

(3)操作符棧再出棧一次,目的是為了將'('給彈出

2.s不是')',那麼肯定有s為"*/"且no為"+-"

直接將s入操作符棧即可

若s優先順序等於no,只有可能為加對減或乘對除,根據運算子結合順序應該先計算先遇到的運算子,即先計算棧中的運算子,這裡不可能為括號因為若no為括號則必定包含有其他運算,如(3+4),這裡不符合要求。

出棧棧頂運算子並賦值給no->數字棧出棧兩次分別記為n1,n2->根據no對n1和n2進行計算->將計算結果入數字棧

若s優先順序低於no

若no是'('

直接將s入操作符棧

否則當操作符棧非空且s的優先順序不大於no的優先順序時,迴圈執行下列操作

1.操作符棧出棧並賦值給no

2.判斷no是否為'('

是->將no重新壓入操作符棧,跳出迴圈

3.數字棧出棧兩次分別記為n1,n2

4.根據no對n1和n2進行計算

5.將4中的計算結果入數字棧

6.讀取操作棧頂元素並賦值給no

將s壓入操作符棧

當操作符棧非空時,迴圈執行下列操作

1.出棧操作符棧並賦值給no

2.數字棧出棧兩次分別記為n1,n2

3.根據no對n1和n2進行計算

4.將3中的計算結果入數字棧

數字棧頂元素即為最終結果

**:

#include #include #include #include using namespace std;

int numi = 0;//數字棧頂指標

int opi = 0; //操作符棧頂指標

bool empnum();//判斷是否數字棧為空 空true

float popnum(float num);//數字棧出棧

void pushnum(float num, float n);//數字棧入棧

bool empop();//判斷是否操作符棧為空 空true

char popop(char op);//字元棧出棧

void pushop(char op, char o);//字元棧入棧

char getop(char op);//取字元棧棧頂元素

bool isnum(char s);//判斷s是否為數字型別,小數點也算

bool isop(char s);//判斷s是否為操作符型別

int checkpre(char s1, char s2);//判斷優s1和s2的優先順序;>返回1;《返回-1;==返回0

float cal(char s, float n1, float n2);//計算n1和n2對應s操作的結果

void clearc(char str, int n);//陣列初始化

bool empnum()

else

} float popnum(float num)

else

} void pushnum(float num, float n)

bool empop()

else

}char getop(char op)

else

} char popop(char op)

else

} void pushop(char op, char o)

bool isnum(char s)

else

}bool isop(char s)

else

}int checkpre(char s1, char s2)

else

}else if(s1 == '*' || s1 == '/')else if(s2 == '*' || s2 == '/')else

}else

}float cal(char s, float n1, float n2)

case '-':

case '*':

case '/':

} return n2;

}void clearc(char str, int n)

} int main()

sum = atof(stemp);

pushnum(num, sum);//入棧

i = j-1;

continue;

}else if(isop(s))else

popop(op);

}else

}else if(checkpre(s, no) == 0)elseelse

float n1 = popnum(num);

float n2 = popnum(num);

n2 = cal(no,n1,n2);

pushnum(num,n2);

no = getop(op);

}pushop(op,s);

} }

}} }

while(!empop())

cout

}

中綴 字尾表示式 四則運算

中綴表示式轉化為字尾表示式,並通過字尾表示式計算值 轉化規則 出棧 出棧後元素新增到字尾表示式的末尾 中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後 舉例 3 2 5 4 2 過程如下 建立操作符棧,以及儲存字尾表示式的佇列 從頭到尾掃瞄中綴表示式,首先掃瞄到...

四則運算的中綴表示式和字尾表示式

中綴表示式 就是運算符號在數字中間的表達方式。字尾表示式 運算符號在數字的後面出現。1 中綴表示式向字尾表示式的轉換方法 規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分 若是符號,就判斷當前符號與棧頂符號的優先順序,如果是右括號或者是優先順序低於棧頂符號 乘除...

求解簡單的四則運算表示式

輸入乙個四則運算表示式,輸出運算結果,要求對除數為0的情況作特別處理。題目保證輸入與輸出均在雙精度範圍內。輸入格式 輸入在一行中依次輸入運算元1 運算子 運算元2,其間沒有空格,運算元的資料型別為實型。輸出格式 在一行中輸出表示式的運算結果,保留兩位小數。如果除法分母為0,則輸出錯誤資訊 divis...