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 出來的物件和陣列都是儲存在堆中的。從資料結構來說 堆是完全二叉樹 棧...