描述
用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
数据范围: n\le1000n≤1000
要求:存储n个元素的空间复杂度为 O(n)O(n) ,插入与删除的时间复杂度都是 O(1)O(1)
示例1
输入:
["PSH1","PSH2","POP","POP"]
返回值:
1,2
说明:
"PSH1":代表将1插入队列尾部 "PSH2":代表将2插入队列尾部 "POP“:代表删除一个元素,先进先出=>返回1 "POP“:代表删除一个元素,先进先出=>返回2
示例2
输入:
["PSH2","POP","PSH1","POP"]
返回值:
2,1h
预备知识:
栈的特性,
一种数据结构,可以做到先进后出,
如:进栈序列:1,2, 3 ,这全部进栈之后全部出栈结果为3,2,1;
进栈1,进栈2,出栈(先进后出,故出栈2),进栈3,出栈(先进后出,故出栈3),出栈(同理出栈1)
队列特性
先进先出,就像排队一样。
栈的java实现代码
函数 | 功能 |
search(Object o) | 返回对象在堆栈中的位置,以 1 为基数。 |
empty() | 测试堆栈是否为空。 |
peek() | 查看堆栈顶部的对象,但不从堆栈中移除它。 |
pop() | 移除堆栈顶部的对象,并作为此函数的值返回该对象。 |
push(E item) | 把项压入堆栈顶部。 |
/**
* 构造函数
*/
public Stack() {
}
/**
* push函数:将元素存入栈顶
*/
public E push(E item) {
// 将元素存入栈顶。
// addElement()的实现在Vector.java中
addElement(item);
return item;
}
/**
* pop函数:返回栈顶元素,并将其从栈中删除
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
// 删除栈顶元素,removeElementAt()的实现在Vector.java中
removeElementAt(len - 1);
return obj;
}
/**
* peek函数:返回栈顶元素,不执行删除操作
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
// 返回栈顶元素,elementAt()具体实现在Vector.java中
return elementAt(len - 1);
}
/**
* 栈是否为空
*/
public boolean empty() {
return size() == 0;
}
/**
* 查找“元素o”在栈中的位置:由栈底向栈顶方向数
*/
public synchronized int search(Object o) {
// 获取元素索引,elementAt()具体实现在Vector.java中
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
解题思路:
队列是先进先出
栈是先进后出
只要给你两个栈,第一个栈把入栈序列入栈(1,2,3),先进后出(出栈序列3,2,1),把第一个栈的出栈序列(3,2,1)入第二个栈(3,2,1),然后第二个栈出栈(1,2,3,)
观察加粗的地方,发现刚好实现了 1,2,3入栈,1,2,3,出栈,这就是先进先出啊,这就是队列啊!
代码实现
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//如果栈不空,就先把栈清空
while(!stack2.empty()){
stack1.push(stack2.pop());
}
stack1.push(node);
}
public int pop(){
//如果栈不空,就先把栈清空
while(!stack1.empty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}