己 棧,堆,佇列

2021-10-07 12:00:53 字數 4310 閱讀 9446

5. 陣列中元素與下乙個比它大的元素之間的距離

6. 迴圈陣列中比當前元素大的下乙個元素

部分借鑑

224. 基本計算器

方法1:將中綴表示式轉換成字尾表示式,然後使用上面的方法

方法2:直接使用兩個棧進行求解,乙個放數字乙個放表示式

方法3. 使用乙個棧求解

很巧妙,使用乙個棧,對於操作符,左右括號和數字採取不同的出入棧策略。

class

solution

//遇到操作符就進行計算

else

if(t ==

'+')

else

if(t ==

'-')

else

if(t ==

'(')

else

if(t ==

')')

}return res + sign * operand;

}}

227. 基本計算器 ii

策略:

二、處理加減法

現在進一步,如果輸入的這個算式只包含加減法,而且不存在空格,你怎麼計算結果?我們拿字串算式1-12+3為例,來說乙個很簡單的思路:

1、先給第乙個數字加乙個預設符號+,變成+1-12+3。

2、把乙個運算子和數字組合成一對兒,也就是三對兒+1,-12,+3,把它們轉化成數字,然後放到乙個棧中。

3、將棧中所有的數字求和,就是原算式的結果。

三,處理乘除法 從棧裡彈出乙個數(即符號前面的前面的結果)與符號前面的cur進行計算**棧。

class

solution

if(t ==

'+'||t ==

'-'||t ==

'*'||t ==

'/'|| i == s.

length()

-1)else

if(sign ==

'-')

else

if(sign ==

'*')

else

if(sign ==

'/')

cur =0;

sign = t;}}

for(integer i : stack)

return res;

}}

150. 逆波蘭表示式求值

逆波蘭式,也叫字尾表示式,乙個好處就是只需要運算子,不需要括號,不會產生歧義。

注意:

public

intevalrpn

(string[

] tokens)

}return stack.

pop();

}}

232. implement queue using stacks (easy)

leetcode / 力扣

棧的順序為後進先出,而佇列的順序為先進先出。使用兩個棧實現佇列,乙個元素需要經過兩個棧才能出佇列,在經過第乙個棧時元素順序被反轉,經過第二個棧時再次被反轉,此時就是先進先出順序。

class

myqueue

public

intpop()

public

intpeek()

private

void

in2out()

}}public

boolean

empty()

}

225. implement stack using queues (easy)

leetcode / 力扣

在將乙個元素 x 插入佇列時,為了維護原來的後進先出順序,需要讓 x 插入佇列首部。而佇列的預設插入順序是佇列尾部,因此在將 x 插入佇列尾部之後,需要讓除了 x 之外的所有元素出佇列,再入佇列。

class

mystack

public

void

push

(int x)

}public

intpop()

public

inttop()

public

boolean

empty()

}

155. min stack (easy)

leetcode / 力扣

class

minstack

public

void

push

(int x)

public

void

pop(

)public

inttop()

public

intgetmin()

}

對於實現最小值佇列問題,可以先將佇列使用棧來實現,然後就將問題轉換為最小值棧,這個問題出現在 程式設計之美:3.7。

20. valid parentheses (easy)

leetcode / 力扣

"(){}"

output : true

public

boolean

isvalid

(string s)

else

char cstack = stack.

pop();

boolean b1 = c ==

')'&& cstack !=

'(';

boolean b2 = c ==

']'&& cstack !=

'[';

boolean b3 = c ==

'}'&& cstack !='}

}return stack.

isempty()

;}

32. 最長有效括號

class

solution

else

else

else}}

}return max;

}}

739. daily temperatures (medium)

leetcode / 力扣

input: [73, 74, 75, 71, 69, 72, 76, 73]

output: [1, 1, 4, 2, 1, 1, 0, 0]

在遍歷陣列時用棧把陣列中的數存起來,如果當前遍歷的數比棧頂元素來的大,說明棧頂元素的下乙個比它大的數就是當前元素。

public

int[

]dailytemperatures

(int

temperatures)

indexs.

add(curindex);}

return dist;

}

class solution 

s.push(i);

}return res;}}

503. next greater element ii (medium)

leetcode / 力扣

input: [1,2,1]

output: [2,-1,2]

explanation: the first 1's next greater number is 2;

the number 2 can't find next greater number;

the second 1's next greater number needs to search circularly, which is also 2.

與 739. daily temperatures (medium) 不同的是,陣列是迴圈陣列,並且最後要求的不是距離而是下乙個元素。

public

int[

]nextgreaterelements

(int

nums)

if(i < n)

}return next;

}

739. 每日溫度

class

solution

s.push

(i);

}return res;

}}

堆與棧 佇列

首先,我們舉乙個例子 void f 這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆記憶體,那麼指標p呢?他分配的是一塊棧記憶體,所以這句話的意思就是 在棧記憶體中存放了乙個指向一塊堆記憶體的指標p。在程式會先確定在堆中分配記憶體的大小,然後呼叫operator ne...

迷宮(棧,堆,佇列)

學步園中的這篇文章簡直太讚了 作者寫的很棒!從學步園的這篇部落格中,我們可以發現,廣度優先搜尋採用佇列,而深度優先搜尋採用棧或者是遞迴!所以,鄰接矩陣的深度優先遍歷其實也是可以採用棧進行實現的 阿里的測試開發最後一道筆試題 乙個int型的二維intmap組作為乙個迷宮圖,數字為1時是不可通行的牆,數...

棧,佇列,堆的區別

堆,棧,佇列的區別 從記憶體分配上來說 棧是作業系統在建立某個程序或者執行緒時建立的乙個儲存區域,是執行緒私有的,棧中存的是區域性變數之類,函式引數。由作業系統自動分配。堆是程式執行時,向作業系統申請某大小的記憶體空間,所有new 出來的物件和陣列都是儲存在堆中的。從資料結構來說 堆是完全二叉樹 棧...