nyoj35表示式求值

2021-08-03 20:36:54 字數 1288 閱讀 7221

逆波蘭式式也稱字尾表示式。

一般的表示式求值式子都為中綴表示式,而字尾表示式求值相對更容易,所以可以

將中綴表示式轉換為字尾表示式。

ps:不了解中綴表示式,字尾表示式的建議先去了解一下。

對於初學者容易弄混這三種,其實前,中,後即節點位置。

字首表示式樹,遍歷順序(節點,左,右)。

中綴表示式樹,遍歷順序(左,節點,右)。

字尾表示式樹,遍歷順序(左,右,節點)。

步驟:

第一步:將中綴表示式轉換為字尾表示式。

1,將+,-,*,/,(等要用到的運算進行優先順序處理。

2,需要用到乙個符號棧處理:

a,數字字元,小數點直接存入另乙個字串s。

b,』(『直接入棧,當表示式str字元中『)』出現,將所有棧頂運算子轉移至s直至遇到『(』,『(』出棧。

c,當表示式str字元中的運算子優先順序大於等於(注意一定要大於等於)棧頂運算子優先順序時,將字元依次存入s,直至小於為止。當前運算子入棧。

d,最後當str訪問完,將棧中剩餘運算子存到s。

第二步:將轉換後的字尾表示式進行求值。

1,需要乙個浮點型棧(具體根據題目要求)存放數值。

2,遍歷s遇見運算元,小數點時處理後入棧,直至遇見運算子,出棧兩個運算元,處理後將結果再入棧。

3,棧頂元素即為表示式解。

#include#include#include#include#include#include#includeusing namespace std;

string s1,s2;

stacks;

stackc;

void init()//清空

int yx(char ch)//優先順序

}void deal()//把中綴表示式s1換成字尾表示式s2

s.push(s1[i++]);//反之入棧

}else if(s1[i]==')')//遇到右括號就去配對左括號,把中間的東西都轉換掉

i++;

s.pop();

}else

}while(s.top()!='#')//((1+2)*5+1)/4這一步就是為了改"/"

}double jieguo()//把更改後的s2來通過棧求最後結果,最後棧頂元素就是結果

if(s2[i]=='.')//小數轉換

x+=y;}}

}c.push(x);}}

return c.top();

}int main()

return 0;

}

NYOJ35 表示式求值

搞了差不多2天,原來乙個是sstream的用法困惑好久,需要對陣列清零 include include include include include include includeusing namespace std char mid 1008 post 1008 char compare ch...

nyoj 35 表示式求值

描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入 第一行輸入乙個整數n,共有n組測試資料 n 10 每組測試資料只...

NYOJ 35 表示式求值

表示式分為字首表示式,中綴表示式,字尾表示式,對於不涉及運算子優先順序的用中綴表示式直接做比較方便,如果涉及到的優先順序的把中綴表示式轉化成字首或字尾表示式比較方便。本體我用的是字首表示式解題。include include include include includeusing namespac...