Data Structure
Use case:
Time Complexility
Operation | T.C. |
---|---|
Push | O(1) |
Pop | O(1) |
Peek | O(1) |
Size | O(1) |
Search | O(n) |
Problem: Check if braces and brackets are properly closed in given String
public static boolean hasMatchingBraces(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.toString(c).isBlank()) {
continue;
}
// is left/opening bracket
if (isOpeningBracket(c)) {
stack.push(c);
continue;
}
char rev = getOpeningdBracket(c);
if (stack.isEmpty() || stack.pop() != rev) {
System.out.println("Missing opening brackets for - " + rev);
return false;
}
}
return true;
}
Implementation:
Stacks can often implemented using Arrays, Singly Linked List or Doubly Linked List.
Arrays Implementation:
private T[] data;
private static int initialCapacity = 1 << 3; // default capacity 2^3 = 8
private int top = -1;
top
is sent to -1
, When stack is empty.initialCapacity = initialCapacity << 1;
data = Arrays.copyOf(data, initialCapacity);
Check below link for Custom Implementation of Dynamic Array.
public interface Stack<T> {
// Add element on top
public void push(T elem);
// Returns the last inserted element.
public T pop();
// Returns the last inserted element.
public T peek();
// Returns the no. of elements present in the stack.
public int size();
public boolean isEmpty();
}
public class ArrayStack<T> implements Stack<T> {
private T[] data;
// Initial capacity 16
private static int initialCapacity = 1 << 3;
// Points to the most recent object pushed.
private int top = -1;
public ArrayStack() {
this(initialCapacity);
}
@SuppressWarnings("unchecked")
public ArrayStack(int capacity) {
initialCapacity = capacity;
data = (T[]) new Object[initialCapacity];
}
// Other API implementation
}
References: