题目描述
用两个栈实现一个队列。
思路
利用具体的例子,画图进行抽象
- 所有到来的元素都压入stack1
- 将stack1的元素逐个弹出压入stack2,则stack2中的顺序正好和原来stack1相反
- 当stack2不为空,stack2栈顶的元素是最先进入队列的元素,可以弹出
- 当stack2为空,把stack1中所有元素逐个压入stack2,再从stack2直接弹出
时间复杂度:O(2N),逐个压栈弹栈
空间复杂度:O(N-2N),两个栈存储原本队列的元素
代码实现:
package offer;
import java.util.Stack;
public class T09_CQueue {
private Stack<Character> stack1=new Stack<Character>();
private Stack<Character> stack2=new Stack<Character>();
public void appendTail(Character element)
{
stack1.push(element);
}
public Character deleteHead()
{
if(stack2.size()<=0)
{
while(stack1.size()>0)
{
Character data=stack1.pop();
stack2.push(data);
}
}
if(stack2.size()==0)
{
System.out.println("queue is empty!");
return null;
}
Character head=stack2.pop();
return head;
}
}
测试
- 往空的队列添加、删除元素
- 往非空的队列添加、删除元素
- 连续删除元素直至队列为空
package offer;
public class T09_QueueWithTwoStacks {
public static void Test(Character actual,Character expected) {
if(actual==expected)
System.out.println("Tested passed.");
else
System.out.println("Tested failed.");
}
public static void main(String[] args) {
T09_CQueue queue =new T09_CQueue();
queue.appendTail('a');
queue.appendTail('b');
queue.appendTail('c');
Character head=queue.deleteHead();
Test(head,'a');
head=queue.deleteHead();
Test(head,'b');
queue.appendTail('d');
head=queue.deleteHead();
Test(head,'c');
queue.appendTail('e');
head=queue.deleteHead();
Test(head,'d');
head=queue.deleteHead();
Test(head,'e');
head=queue.deleteHead();
Test(head,null);
}
}