Java 棧
在leetcode遇到一個問題,給一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。解題的時候用到了棧的方法,查了一些資料,順便學習一下,記錄一下。
先看一下代碼:
public class IsValid {
public static void main(String[] args) {
String a = "()";
boolean valid = isValid(a);
System.out.println(valid);
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(') {
stack.push(')');
} else if (c == '[') {
stack.push(']');
} else if (c == '{') {
stack.push('}');
} else if (stack.isEmpty() || c != stack.pop()) {
return false;
}
}
return stack.isEmpty();
}
}
這裏用到了Java 棧 類的
stack.push()
方法
棧是Vector的一個子類,它實現了一個標準的後進先出的棧。
堆棧只定義了默認構造函數,用來創建一個空棧。 堆棧除了包括由Vector
定義的所有方法,也定義了自己的一些方法。
Stack() 菜鳥教程
序號 | 方法描述 |
---|---|
1 | boolean empty() 堆棧是否爲空。 |
2 | Object peek( ) 堆棧頂部的對象,但不從堆棧中移除它。 |
3 | Object pop( ) 移除堆棧頂部的對象,並作爲此函數的值返回該對象。 |
4 | Object push(Object element) 把項壓入堆棧頂部。 |
5 | int search(Object element) 返回對象在堆棧中的位置,以 1 爲基數。 |
看一下 Stack
的底層源碼:
public class Stack {
/**
* 所述Stack類表示對象的後進先出(LIFO)堆棧。
* 它擴展類Vector有五個操作,它允許載體來作爲堆棧進行處理。
* 通常的push和pop提供業務,以及在堆棧頂部的項目,測試方法爲堆棧是否爲空 ,
* 和方法來偷看的方法來搜索堆棧中的項目和發現多遠從頂部。
* 首次創建堆棧,它不包含的項目。
* LIFO堆棧操作的更完整和一致的集合由提供Deque接口及其實現方式,應優先使用此類
*/
public class Stack<E> extends Vector<E> {
/**
* 創建一個空Stack
*/
public Stack() {
}
/**
* 把項壓入該堆棧的頂部。 這有完全相同的效果:
*/
public E push(E item) {
addElement(item);
return item;
}
/**
* 刪除對象在該堆疊的頂部並返回該對象作爲該函數的值。
*
* @return 在這個堆棧頂部的對象(Vector對象的最後一項)
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
* 返回棧頂元素,不執行刪除操作
*
* @return
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* 棧是否爲空.
*/
public boolean empty() {
return size() == 0;
}
/**
* 返回基於1的位置處的對象在棧上。
* 如果對象o如在此堆棧的項目,則此方法返回從最靠近疊層的頂部發生的堆棧的頂部的距離;
* 堆棧上的最上面的項目被認爲是在距離1。
* equals方法來比較Ø在這個堆棧的項目。
*
* @return 從該對象位於堆棧頂部的基於1的位置; 返回值-1表示該對象不是在堆棧中
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
private static final long serialVersionUID = 1224463164541339165L;
}
Stack.Peek 與 stack.pop 的區別
相同點
:都返回棧頂的值。
不同點
:peek
不改變棧的值(不刪除棧頂的值),pop
會把棧頂的值刪除。