面試題(十五)四則運算表示式

2021-06-22 21:10:33 字數 1401 閱讀 8548

乙個四則運算表示式該如何求值,比如

(2+1)*(2+3)+2*6

這裡只考慮+-*/()的形式

先把四則運算符(中綴表示式)轉換成字尾表示式,再利用棧對字尾表示式進行處理;

關鍵是如何將中綴表示式轉換成字尾表示式,規則如下:

(1)如果當前字元是數字,直接輸出到字尾表示式

(2)如果是『(』,壓棧

(3)如果是『)』,將棧中從『(』到棧頂的元素全部退棧,並輸出到字尾表示式,棧中的『(』退棧即可不需要輸出到字尾表示式

(4)如果當前元素的優先順序小於棧頂元素的優先順序,本著優先順序越大距離數字越近的原則,將棧頂元素依次退棧,輸出到字尾表示式,直到當前元素的優先順序大於等於棧頂元素的優先順序

(4)其他情況,直接入棧

當所有字元處理完畢後,依次將棧內元素退棧到字尾表示式中

**如下:

#include#include using namespace std;

int priority(char c);

bool calculate(char *pstr,int &nres);

void convert(const char *pstrsrc,char *pstrobj);

int main()

else if (stacktemp.empty())

else if (pstrsrc[i]=='(')

else if (pstrsrc[i]==')')

if (!stacktemp.empty())

}//優先順序越高,離資料越近

else if (priority(pstrsrc[i])priority(pstrsrc[i]))

stacktemp.push(pstrsrc[i]);

} else

}while(!stacktemp.empty())

for (int i=0;iss;

ss.push(pstr[0]);

for (int i=1;i='0')

else

else if (pstr[i]=='-')

else if (pstr[i]=='*')

else if (pstr[i]=='/')

int ntemp1=ss.top()-'0';

ss.pop();

ss.push(ntemp1/ntemp2+'0');

}} }

nres=ss.top()-'0';

return true;

}int priority(char c)

else if(c=='-')

else if (c=='*')

else if(c=='/')

else

return -1;

}

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

四則運算表示式總結

這兩周完成了第乙個個人專案 四則運算表示式。在整個開發的過程中我有一些收穫也發現了自身的一些問題。下面就分條簡述一下。1 實現隨機生成任意長度的四則表示式 括號 2 實現四則表示式的計算 包括分數 3 實現接收使用者對某四則運算表示式計算的結果並判斷正確性。4 實現結合1 2 3功能的mfc應用程式...