實現乙個基本的計算器來計算乙個簡單的字串表示式的值。
字串表示式可以包含左括號 ( ,右括號 ),加號 + ,減號 -,非負整數和空格 。
示例 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...