刷題計畫 棧演算法 三

2021-10-05 12:09:36 字數 3319 閱讀 7041

題目:

根據逆波蘭表示法,求表示式的值。

有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。

說明:

示例 1:

輸入:[

"2",

"1",

"+",

"3",

"*"]

輸出:9

解釋:((2

+1)*

3)=9

示例 2:

輸入:[

"4",

"13"

,"5"

,"/"

,"+"

]輸出:

6解釋:(4

+(13/

5))=

6示例 3:

輸入:[

"10"

,"6"

,"9"

,"3"

,"+"

,"-11"

,"*"

,"/"

,"*"

,"17"

,"+"

,"5"

,"+"

]輸出:

22解釋:((

10*(6

/((9

+3)*

-11))

)+17)

+5=(

(10*(

6/(12

*-11)

))+17

)+5=

((10*

(6/-

132))+

17)+5

=((10

*0)+

17)+5

=(0+

17)+5

=17+5

=22

題目中給定的字串為有效的逆波蘭表示式, 在進行計算之前首先要解決兩個問題:

通過分析之後,將主要解決問題劃分為3個子問題進行處理:

判斷字串是否為數字

此問題不能簡單的通過呼叫isalnum來判斷,因為一旦出現兩位數「10」,或者負數「-1」,將不能判斷

數字字串轉為int型別數字計算

在解決這些問題後,就可以進行對逆波蘭表示式的計算過程

class

solution

}return

false;}

// 數字字串轉int數字

intstrtonum

(string &str)

}else

}return negative?

-res: res;

}// 計算

intcaculate

(int

&a,int

&b,char operat)

return res;

}int

evalrpn

(vector

& tokens)

stack<

int> st;

for(

int i =

0; i < tokens.

size()

; i++

)else

}return st.

top();

}};

題目:

給定乙個二叉樹,返回它的 前序 遍歷。

示例:

輸入:[

1,null,2,

3]1 \

2/3

輸出:[1,

2,3]

作為一道基礎的二叉樹問題,遞迴的解法自然不同多說。

從題目本質的性質來說,二叉樹的前序遍歷,中序遍歷以及後序遍歷都屬於深度優先搜尋演算法的一種變形形式,正因如此,才要一定使用的結構來儲存父節點的資料,以此達到類似於路徑搜尋的目的。

另外,前序遍歷的順序為根->左子樹->右子樹,這就意味著棧首先壓入根節點,再壓入左子樹節點,再壓入右子樹節點。

至此,迭代方式來完成二叉樹的前序遍歷的準備工作已經完成。

class

solution

// 左子樹的「左節點」遍歷結束,之後開始遍歷左子樹的「右節點」

// 同理,當左子樹遍歷結束,開始遍歷右子樹;

// 之後,右子樹的「最左節點」,每乙個左節點的左右子樹,以此類推

root = st.

top();

st.pop();

root = root-

>right;

}return res;}}

;

題目:

給定乙個二叉樹,返回它的中序 遍歷。

示例:

輸入:[

1,null,2,

3]1 \

2/3輸出:[1,

3,2]

中序遍歷的順序為左子樹->根節點->右子樹,從前序遍歷的方法中可以大致推導出基本框架為:

while

(root || st.

size()

)// while結束,表明已經抵達該子樹的「最左」節點,目前棧頂元素就是「最左」節點的位址

// 毫無疑問,「最左節點」的左右子樹均為null

root = st.

top();

st.pop();

res.

push_back

(root-

>val)

;// 正因「最左節點」的左右子樹均為null,且「最左節點」已經確定,因此「最左節點」的右子樹,就成了「回溯」的關鍵條件

root = root-

>right;

}

一句話來總結,就是不斷確定目前節點的「最左節點」,並以「最左節點」的右子樹是否為null為回溯的條件。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

root = st.

top();

st.pop();

res.

push_back

(root-

>val)

; root = root-

>right;

}return res;}}

;

刷題計畫 雙指標演算法(一)

leetcode上的一些能用雙指標辦法解決的演算法題題解 86.分割鍊錶 中等 題目 給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3輸出 1 2 ...

演算法題目刷題 第三題,反轉棧只用遞迴函式

題目 乙個棧依次壓入1,2,3,4,5,那麼從棧頂部到棧底部分別為5,4,3,2,1.將這個棧轉置後,從棧頂到棧底為1,2,3,4,5.也就是實現棧中元素的逆序,但是只能用遞迴函式來實現,不能用其他資料結構。思路 這個題目用了遞迴函式的思想,本來遞迴函式底層就是棧結構實現的。用圖私下做出函式遞迴呼叫...

LeetCode C 刷題計畫 15 三數之和

author csu張揚 email csuzhangyang gmail.com or csuzhangyang qq.com category difficulty pass rate br algorithms medium 24.31 array two pointers adobe ama...