表示式求值 自己實現的坑

2021-09-11 16:05:53 字數 1391 閱讀 5499

1.運算子優先順序,自己的優先順序小於自己!矩陣0多1少

2. 如果表示式中有空格,一定使用gets讀取表示式!!

3.注意可能會需要使用double棧儲存數字防止小數

如果表示式中有括號,左括號直接強制入棧!

右括號優先順序比加減乘除都低。

1.左括號的優先順序僅高於#;

2.但是遇見左括號時,不用和optr棧頂元素進行優先順序比較,直接強制進optr棧;

3.遇到右括號,退ovs棧兩次,退optr棧一次,進行相應的運算操作,將計算結果壓入ovs棧,直到optr棧頂元素是左括號為止,並將左括號彈出optr棧;

#include#includeusing namespace std;

stackop;

stackin;

char str[220];

//運算子優先順序 0+-*/ 其中0是自定義的優先順序最低的運算子 

//值為1代表優先順序高 

int mat[5]=;

//reto代表是運算子還是數字 

//retn代表返回值 :運算子編號或者數字

//i是字串標號 

void getop(bool &reto,int &retn,int &i)

if(str[i]==0)

if(str[i]>='0'&&str[i]<='9')

else

if(str[i]=='-')

if(str[i]=='*')

if(str[i]=='/')

i+=2;

//i向後移動 跨過當前運算子和空格 

return;

}//擷取完整數字

retn=0;

for(;str[i]!=0&&str[i]!=' ';i++)

//如果題目說明數字後沒空格,下面跳過空格的**注釋掉即可

if(str[i]==' ')

return;    

}int main()

//重置清零操作 

bool retop;

int retnum;

int idx=0;

while(!op.empty())

while(!in.empty())

//開始處理 

while(true)

else

else if(o==2)

else if(o==3)

else if(o==4)

in.push(result);

}op.push(retnum);}}

else

if(op.size()==2&&op.top()==0)

}printf("%.2f\n",in.top());

}return 0;

}

表示式求值的實現

表示式求值是乙個很有意思的技術話題,國內外討論這個話題的技術人員很多,也有非常多的實現方案。倒不是說這個問題很難解決,只是說它提供了很好的話題,讓各路高手使用自己的手段來解決問題,百家爭鳴,各展所長。該話題也提供了乙個非常好的想像空間讓大家一起討論技術討論方案,也是乙個資料結構教程中的經典教育案例。...

字尾表示式實現表示式求值

看到別人寫的乙個表示式求值程式,想到很久之前寫的乙個。中間有個字串轉數值型,可以用stringstream來實現或者c語言裡面的strtod直接得到 include include include include includeusing namespace std class data doubl...

表示式求值(c 實現)

今天寫了乙個表示式求值的程式。基本功能為 輸入乙個表示式比如23 34 21 56 45 1 然後程式求出結果。而且按照四則運算的優先順序,同時支援括號。下面是程式執行的畫面 程式的難點在於把乙個字串分解為運算元和操作符並能正確處理各個操作符的優先順序,特別是有括號的情況。本程式主要採用了傳統的方法...