剑指offer刷题总结(七)栈和队列

1. 用 两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:
入栈给stack1,出栈时,若stack2不为空,则出栈,若为空,把stack1的内容全都放入stack2,然后再出栈

代码实现:

public class problem1 {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();

public void push(int node) {
stack1.push(node);
}

public int pop() {
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}

}
return stack2.pop();
}
}

2. 包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

代码实现:

public class problem2 {

Stack<Integer> stackData = new Stack<>();
Stack<Integer> stackMin = new Stack<Integer>();

/**
* 思路:用一个栈stack保存数据,用另外一个栈min保存依次入栈最小的数
* 比如,stack中依次入栈,5, 4, 3, 8, 10,11,12,1
* 则min依次入栈,5, 4, 3, 3, 3, 3, 3, 1
* 每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则入stack的栈顶元素。
* 保持stack中和min中保持相同个数的元素 ,同时保持min的栈顶是此时原栈的最小值。
**/
public void push(int node) {
stackData.push(node);
if(stackMin.size()==0||stackMin.peek()>node)
stackMin.push(node);
else
stackMin.push(stackMin.peek());
}

public void pop() {
if(!stackData.isEmpty()) {
stackData.pop();
stackMin.pop();
}
}

public int top() {
return stackData.peek();
}

public int min() {
return stackMin.peek();
}
}

3. 栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

代码实现:

public class problem3 {
public boolean IsPopOrder(int[] pushA, int[] popA) {
if (pushA == null || popA == null || pushA.length == 0
|| popA.length == 0)
return false;
int index = 0; //作为弹出序列的一个索引
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < pushA.length; i++) {
stack.push(pushA[i]);
while (!stack.isEmpty() && stack.peek() == popA[index]) {// 当栈不为空且栈顶元
//素等于弹出序列元素时候,就弹出一个,同时让弹出序列后移一个
stack.pop();
index++;
}
}
return stack.isEmpty();//如果最后,栈不为空,相当于没有按照给定的弹出popA弹出完毕,
//就说明不能按照popA,返回false
}
}
-------------本文结束感谢您的阅读-------------