题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]]
输出:
[null,null,3,-1]
示例2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”] [[],[],[5],[2],[],[]]
输出:
[null,-1,null,null,5,2]
简单介绍:
题目:用两个栈实现队列
题目难度:简单
使用语言:JAVA。
这道题来自leetcode题库的设计标签。
解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.栈是先入后出,队列是先入先出。如何使用两个栈模拟队列
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.stack s1:保存队尾入队元素。
2.stack s2:调整栈元素,用来实现队头出队
算法:
既然明确了stack作为解决该题的数据结构,我们就可以开始我们的算法分析了。
1.队尾元素入队,保存到栈1
2.队列头部删除整数,利用栈2调整栈1的元素,实现队头元素出队。
分三种情况:
a.栈2非空,有上次留下的元素
b.栈2空,栈1空
c.栈2空,栈1不空
代码部分:
import java.util.Stack;
//栈是先入后出,队列是先入先出。利用一个辅助栈调整,即可实现队列
class CQueue {
Stack<Integer> s1;//用于保存栈元素
Stack<Integer> s2;//调整栈元素
public CQueue() {
s1=new Stack<Integer>();
s2=new Stack<Integer>();
}
public void appendTail(int value) {
s1.push(value);//入1栈
}
public int deleteHead() {
if(!s2.empty()) return s2.pop();//2栈还有上次留下的元素
if(s1.empty()) return -1;//1栈和2栈空
while(!s1.empty()){
s2.push(s1.pop());//调整1栈元素的顺序
}
return s2.pop();
}
}
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!