堆疊 逆波蘭表示式 224 基本計算器

2021-10-06 17:16:05 字數 3245 閱讀 1222

實現乙個基本的計算器來計算乙個簡單的字串表示式的值。

字串表示式可以包含左括號 ( ,右括號 ),加號 + ,減號 -,非負整數和空格 。

示例 1:

輸入:

"1 + 1"

輸出:2

示例 2:

輸入:

" 2-1 + 2 "

輸出:3

示例 3:

輸入:

"(1+(4+5+2)-3)+(6+8)"

輸出:23

說明:

你可以假設所給定的表示式都是有效的。

請不要使用內建的庫函式 eval。

解題:雙堆疊——分別儲存數字和符號

num儲存數字;

cal儲存符號;

(1)若遇到優先順序不低於cal頂部的符號,彈出cal頂部和num中兩個數字,計算;

(因為本題只有加減,所以這樣彈出耗費時間,無需這樣計算)

(2)若遇到右括號,彈出計算,並彈出左括號;(本題括號之間最多只有兩個數字和乙個符號)

(3)遍歷結束後再檢視num和cal有無剩餘(本題最多兩個數和乙個符號)

因為彈出壓入操作過多,超時,需要優化;

class

solution

//遇到符號,放入堆疊2

elseif(

!cal.

empty()

&&(cal.

top()==

'+'||cal.

top()==

'-')

&&(s[i]

=='+'

||s[i]

=='-'))

else

if(t==

'-')

//將當前符號加入

cal.

push

(s[i]);

}else

if(s[i]

==')'

)//遇到右括號

else

if(cal.

top()==

'-')

cal.

pop();

//把左括號彈掉

}else

if(s[i]

!=' '

)cal.

push

(s[i]);

//加入當前符號,左括號 //別忘了忽略空格

++i;

}int res=num.

top();

num.

pop();

if(!cal.

empty()

)if(cal.

top()==

'+') res+

=num.

top();

else res=num.

top(

)-res;

return res;

}private

:int i;

stack<

int> num;

stack<

char

> cal;

intgetnum

(string s)

};

優化**——減少函式

class

solution

//遇到符號,放入堆疊2

elseif(

!cal.

empty()

&&(cal.

top()==

'+'||cal.

top()==

'-')

&&(s[i]

=='+'

||s[i]

=='-'))

else

if(t==

'-')

//將當前符號加入

cal.

push

(s[i]);

}else

if(s[i]

==')'

)//遇到右括號

else

if(cal.

top()==

'-')

cal.

pop();

//把左括號彈掉

}else

if(s[i]

!=' '

)cal.

push

(s[i]);

//加入當前符號,左括號 //別忘了忽略空格

++i;

}int res=num.

top();

num.

pop();

if(!cal.

empty()

)if(cal.

top()==

'+') res+

=num.

top();

else res=num.

top(

)-res;

return res;

}private

:int i;

stack<

int> num;

stack<

char

> cal;

};

解題:單堆疊解題——只考慮加減

每次得到數字num;

加入res,為結果;

(1)遇到-,則符號為-1, 遇到+,則符號為+1;

(2)若遇到(,則將res和sign壓入堆疊,先計算括號中的數;

(3)遇到),則出棧sign和以前的res,res=sign*res+st.top();st.pop();

最後返回res即可;

class

solution

else

if(s[i]

=='+'

) sign=1;

else

if(s[i]

=='-'

) sign=-1

;else

if(s[i]

=='('

)else

if(s[i]

==')'

) i++;}

return res;

}private

: stack<

int> st;

};

波蘭表示式 逆波蘭表示式

中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...

波蘭逆波蘭表示式

實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...

波蘭表示式與逆波蘭表示式

2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...