即禁止栈中出现a<b<c排列
所以对每个要入栈的元素进行判断,如果栈中有两个比他小的元素则禁止入栈
判断栈中的两个最小的元素:
1.在每次push的时候全部遍历一遍,复杂度O(n)
2.类中维护两个变量min1,min2,分别表示最小,次小,那么
在每次push时候更新这两个变量,复杂度O(1)
在每次pop的时候更新这两个变量,有:
1.把min1,min2其中之一pop出去了,那么stack中两个最小的变量变了,要重新遍历找回这两个值,复杂度O(n)
2.并没有pop出去,无需遍历
我采用的是方法一
package Cap1;public class StackPro<Item extends Comparable<Item> >{/*** @param args*/private Node first;private int N;private class Node{Item item;Node next;}public boolean isEmpty(){return first == null;}public int size(){return N;}private boolean check(Item item){if(N<2) return true;Node cur = first;Item min1, min2;if(cur.item.compareTo(cur.next.item)<0){min1 = cur.item;min2 = cur.next.item;}else {min1 = cur.next.item;min2 = cur.item;}for(cur = cur.next.next;cur!=null; cur = cur.next){if(cur.item.compareTo(min2)<0){if(cur.item.compareTo(min1)>0)min2 = cur.item;else {min2 = min1;min1 = cur.item;}}}return min2.compareTo(item)<=0;}public void push(Item item){if(check(item)==false) return; Node oldfirst = first;first = new Node();first.item = item;first.next = oldfirst;N++;}public Item peek(){if(N==0) return null;return first.item;}public Item pop(){Item item = first.item;first = first.next;N -- ;return item;}}