给出入栈序列,同时给出出栈序列,怎么判断出栈序列是不是正确的?
相信这道题在笔试中经常出现,那么编程如何实现,大致思路如下:
比如现在给出入栈序列,1->2->3->4->5,出栈序列2->3->5->4->1
- 我们首先拿到一个栈,按照入栈顺序将第一个元素放入栈中,此时栈中有元素1,栈顶元素1
- 紧接着我们判断此时栈顶元素是否等于出栈序列的第一个元素,1≠2,继续入栈新的元素
- 此时2入栈,栈中有1,2,2位于栈顶,再执行和出栈序列第一个元素判断的操作,2=2,将2出栈,此时出栈序列将2拿走,剩余3->5->4->1
- 此时3入栈,栈中有1,3,3位于栈顶,此时3与出栈序列第一个元素判断,3=3,将3出栈,出栈序列将3拿走,剩余5->4->1
- 此时4入栈,栈中有1,4,4位于栈顶,此时4与出栈序列第一个元素判断,4≠5,继续入栈新元素
- 此时5入栈,栈中共有1,4,5,5位于栈顶,此时5与5相等,5出栈,出栈序列将5拿走,剩余4->1,栈顶元素为4,4与出栈序列第一个元素判断,4=4,4出栈,同时出栈序列将4拿走,剩余1,栈中只剩最后一个元素1,此时恰好等于最后一个出栈元素1
即可知,在入栈序列为1->2->3->4->5的条件下,出栈序列2->3->5->4->1是一个合法的出栈序列
核心思路在于,判断栈顶元素是否等于此时出栈序列的第一个元素,若是,则执行出栈操作,同时指针后移,若否,继续入栈新的元素,继续执行判断操作。
实现代码如下:
import java.util.Stack;
/**
* @author F3ver1
* @date 2019/4/24 21:37
*/
public class Main {
public static void main(String[] args) {
String push = "12345";
String pop = "23541";
System.out.println(PopSerial(push, pop));
}
public static boolean PopSerial(String push, String pop) {
if (push == null || pop == null || (push.length() != pop.length())) {
return false;
}
int pushLen = push.length();
int popLen = pop.length();
Stack<Character> stack = new Stack<>();
int pushIndex = 0; //记录入栈指针
int popIndex = 0; //记录出栈指针
while (pushIndex < pushLen) {
stack.push(push.charAt(pushIndex));
pushIndex++;
//核心判断条件
while (!stack.isEmpty() && (stack.peek() == pop.charAt(popIndex))) {
stack.pop();
popIndex++;
}
}
//当指针走完整个序列长时,退出并给出结果
if (stack.isEmpty() && popIndex == popLen) {
return true;
} else {
return false;
}
}
}