1.给定两个序列 第一个序列是栈的压入序列 第二个序列是栈的弹出序列 判断第二个序列是否是第一个序列正确的弹出序列
问题分析:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入序列为1,2,3,4,5,其可能的一个弹出顺序为4,5,3,2,1(先入1,2,3,再入4,随后弹出4,再入5随后全部弹出)。但4,3,5,1,2(若要4先出,则应4再3前入栈)就不可能为此栈的弹出队列。 思路分析:我们可以借助一个栈,同时再两个队列中分别定义两个临时指针。首先,让入栈队列中的元素按临时指针依次入栈,随后获取栈顶元素与出栈队列中的临时指针进行比较,相等时便弹出并让出栈队列中的临时指针往后移动,继续循环,若临时指针与栈顶元素不相等,则让入栈队列元素依次继续入栈。 代码实现:
public static boolean isPosArray ( int [ ] array1, int [ ] array2) {
if ( array1 == null || array1. length == 0 || array2 == null || array2. length == 0 ) {
return false ;
}
Stack< Integer> stack = new Stack < > ( ) ;
int j = 0 ;
for ( int i= 0 ; i< array1. length; i++ ) {
int curName = array1[ i] ;
stack. push ( curName) ;
while ( ! stack. isEmpty ( ) && stack. peek ( ) == array2[ j] ) {
stack. pop ( ) ;
j++ ;
}
}
if ( stack. isEmpty ( ) ) {
return true ;
}
System. out. println ( "Given array is not a pop-stach array" ) ;
return false ;
}
2.在栈中实现一个函数,返回栈中最小元素
思路分析:要实现一个能返回栈中最小元素的功能,我们可以借助一个辅助栈来实现。可以让我们的辅助栈一直保存数据栈中的最小元素,这样一来在获取最小元素时可以直接获取辅助栈的栈顶元素。那么在入栈时就要将入数据栈元素与辅助栈栈顶元素进行比较,若比栈顶元素小,则将其入栈后,将辅助栈栈顶元素也更新为次元素。 代码实现:
public static Stack< Integer> dataStack = new Stack < > ( ) ;
public static Stack< Integer> assistStack = new Stack < > ( ) ;
public static int getMin ( ) {
if ( assistStack. isEmpty ( ) ) {
throw new UnsupportedOperationException ( "the stack has been empty" ) ;
}
return assistStack. peek ( ) ;
}
public static void pushStack ( int value) {
dataStack. push ( value) ;
if ( assistStack. isEmpty ( ) || value < assistStack. peek ( ) ) {
assistStack. push ( value) ;
} else {
assistStack. push ( assistStack. peek ( ) ) ;
}
}
public static int popStack ( ) {
if ( dataStack. isEmpty ( ) ) {
throw new UnsupportedOperationException ( "the stack has been empty" ) ;
}
assistStack. pop ( ) ;
return dataStack. pop ( ) ;
}
3.两个队列实现一个栈
思路分析:两个队列实现一个栈,即用两个表实现一个栈的功能,即先进后出,我们就需要实现这个栈的入栈和出栈方法。在入栈时,若一个队列为空,则将元素入另一个队列。始终保持两个队列中有一个队列有数据。在弹出时,要实现栈先进先出的特性,则每次弹出时把队列中的元素放入另一个队列中,删除最后一个元素。 代码实现:
3
public static Queue< Integer> queue1 = new LinkedList < > ( ) ;
public static Queue< Integer> queue2 = new LinkedList < > ( ) ;
public static void pushStack ( int value) {
if ( queue1. isEmpty ( ) && queue2. isEmpty ( ) ) {
queue1. add ( value) ;
} else if ( queue1. isEmpty ( ) ) {
queue2. add ( value) ;
} else {
queue1. add ( value) ;
}
}
public static int popStack ( ) {
Queue< Integer> popQueue = queue1. isEmpty ( ) ? queue2 : queue1;
Queue< Integer> pushQueue = queue1. isEmpty ( ) ? queue1 : queue2;
while ( popQueue. size ( ) > 1 ) {
pushQueue. add ( popQueue. remove ( ) ) ;
}
return popQueue. remove ( ) ;
}
4.两个栈实现一个队列
思路分析:与第三题类似,入队时可直接在stack1中入栈,出栈时,若stack2为空,则当stack1不为空时,让stack2入stack1的栈顶元素,最后返回stack2的栈顶元素。
public static Stack< Integer> stack1 = new Stack < > ( ) ;
public static Stack< Integer> stack2 = new Stack < > ( ) ;
public static void pushQueue ( int value) {
stack1. push ( value) ;
}
public static int popQueue ( ) {
if ( stack1. isEmpty ( ) && stack2. isEmpty ( ) ) {
throw new UnsupportedOperationException ( "the stack has been empty" ) ;
}
if ( stack2. isEmpty ( ) ) {
while ( ! stack1. isEmpty ( ) ) {
stack2. push ( stack1. pop ( ) ) ;
}
}
return stack2. pop ( ) ;
}