package com.ralf.stack;
import java.util.NoSuchElementException;
public class StackUtil {
private static MyStack myStack = new MyStack<>();
/**
* ����ջ�е�Ԫ����Integer, ��ջ����ջ���� : 5,4,3,2,1 ���ø÷����� Ԫ�ش����Ϊ: 1,2,3,4,5
* ע�⣺ֻ��ʹ��Stack�Ļ�����������push,pop,peek,isEmpty�� ����ʹ������һ��ջ������
*
* @param <T>
*/
public static <T> void reverse(MyStack<T> stack) {
if (stack.isEmpty()) {
System.out.println("��ջΪ��ջ��");
return;
}
@SuppressWarnings("unchecked")
T[] elements = (T[]) new Object[stack.size()];
for (int i = 0; i < elements.length; i++) {
elements[i] = stack.pop();
}
for (int i = 0; i < elements.length; i++) {
stack.push(elements[i]);
}
}
public static void bad_reverse(MyStack<Integer> s) {
if(s == null || s.isEmpty()){
return;
}
MyStack<Integer> tmpStack = new MyStack<>();
while(!s.isEmpty()){
tmpStack.push(s.pop());
}
s = tmpStack;
}
/**
* ɾ��ջ�е�ij��Ԫ�� ע�⣺ֻ��ʹ��Stack�Ļ�����������push,pop,peek,isEmpty�� ����ʹ������һ��ջ������
*
* @param o
*/
public static <T> void remove(MyStack<T> s, T o) {
if (s.isEmpty()) {
System.out.println("��ջΪ�գ�");
return;
}
MyStack<T> stack = new MyStack<>();
while (!s.isEmpty()) {
T t = s.pop();
if (t.equals(o)) {
PopAndPush(s, stack);
return;
}
stack.push(t);
}
throw new NoSuchElementException("��ջû�и�Ԫ�أ�");
}
private static <T> void PopAndPush(MyStack<T> s, MyStack<T> stack) {
while (!stack.isEmpty()) {
T t = stack.pop();
s.push(t);
}
}
/**
* ��ջ��ȡ��len��Ԫ��, ԭ����ջ��Ԫ�ر��ֲ��� ע�⣺ֻ��ʹ��Stack�Ļ�����������push,pop,peek,isEmpty��
* ����ʹ������һ��ջ������
*
* @param len
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T[] getTop(MyStack<T> s, int len) {
if (s.isEmpty() || len > s.size()) {
return null;
}
MyStack<T> oldStack = s;
T[] elements = (T[]) new Object[len];
for (int i = 0; i < len; i++) {
elements[i] = s.pop();
}
s = oldStack;
return elements;
}
/**
* �ַ���s ���ܰ�����Щ�ַ��� ( ) [ ] { }, a,b,c... x,yz ʹ�ö�ջ����ַ���s�е������Dz��dzɶԳ��ֵġ� ����s =
* "([e{d}f])" , ����ַ����е������dzɶԳ��֣� �÷�������true ��� s = "([b{x]y})",
* ����ַ����е����Ų��dzɶԳ��ֵģ� �÷�������false;
*
* @param s
* @return
*/
public static <T> boolean isValidPairs(String s) {
char[] ch = s.toCharArray();
if (ch.length < 1) {
return false;
}
MyStack<String> leftStack = new MyStack<>();
MyStack<String> rightStack = new MyStack<>();
for (int i = 0; i < ch.length; i++) {
switch (ch[i]) {
case '(':
leftStack.push(String.valueOf(ch[i]));
break;
case '[':
leftStack.push(String.valueOf(ch[i]));
break;
case '{':
leftStack.push(String.valueOf(ch[i]));
break;
case ')':
rightStack.push(String.valueOf(ch[i]));
break;
case ']':
rightStack.push(String.valueOf(ch[i]));
break;
case '}':
rightStack.push(String.valueOf(ch[i]));
break;
default:
break;
}
}
return isPair(leftStack, rightStack);
}
private static boolean isPair(MyStack<String> leftStack,
MyStack<String> rightStack) {
if (leftStack.size() != rightStack.size()) {
return false;
}
reverse(rightStack);
while (!leftStack.isEmpty()) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(leftStack.pop()).append(rightStack.pop());
String pair = stringBuilder.toString();
if (!pair.equals("()") && !pair.equals("[]") && !pair.equals("{}")) {
return false;
}
}
return true;
}
}