跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
Java版剑指offer编程题第21题–栈的压入、弹出序列: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
我的想法
- 创建一个辅助栈,根据进栈和出栈的序列,看能否成功还原,如果能成功还原,就说明该出栈序列是对应的一个弹出序列,否则不是。
解题方法1
public static boolean IsPopOrder(int [] pushA,int [] popA) {
//新建一个辅助栈,还原进栈出栈情况
Stack<Integer> stack = new Stack<>();
//i代表进栈序列数组index,j代表出栈序列数组index
for(int i = 0, j = 0; i < pushA.length; ) {
//还原进栈
stack.push(pushA[i++]);
//当辅助栈的栈顶元素和出栈序列的元素相等,并且辅助栈不为空、出栈序列数组没有越界的时候
while (!stack.isEmpty() && stack.peek() == popA[j] && j < popA.length) {
//辅助栈栈顶元素出栈
stack.pop();
//出栈系列index后移
j++;
}
}
//如果当前栈为空,说明该出栈序列是对的,返回true
return stack.isEmpty();
}
代码测试
package com.learnjiawa.jzoffer;
import java.util.Arrays;
import java.util.Stack;
/**
* @author learnjiawa
* 2019-12-21-22:37
*/
public class Solution21 {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {4,5,3,2,1};
System.out.println("进栈序列:"+ Arrays.toString(arr1));
System.out.println("进栈序列:"+ Arrays.toString(arr2));
System.out.println("判断结果:"+IsPopOrder(arr1, arr2));
}
public static boolean IsPopOrder(int [] pushA,int [] popA) {
//新建一个辅助栈,还原进栈出栈情况
Stack<Integer> stack = new Stack<>();
for(int i = 0, j = 0; i < pushA.length; ) {
//还原进栈
stack.push(pushA[i++]);
//当辅助栈的栈顶元素和出栈序列的元素相等,并且辅助栈不为空、出栈序列数组没有越界的时候
while (!stack.isEmpty() && stack.peek() == popA[j] && j < popA.length) {
//辅助栈出栈
stack.pop();
j++;
}
}
//如果当前栈为空,说明该出栈序列是对的,返回true
return stack.isEmpty();
}
}
代码测试控制台输出结果:
总结
将一个抽象的实例具体化,过程化,用数据结构和算法表达出来,解决问题。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: