题目:用两个栈模拟一个队列
思路讲解:
栈的结构是先进后出,队列的结构是先进先出,那么用两个栈模拟一个队列的思路就是一个栈用来入列,另一个栈用来出列。
看图说话:(请原谅我不小心地截了人家的图)
下面我们采用一个例子来推导结论,继续看图说话:
1)入列:依次往stack1中插入a、b、c
2)出列:若stack2为空的话,那么stack1中元素依次出栈,压入stack2中,此时stack2中的元素从栈顶往栈底方向依次是a、b、c,然后依次弹出元素a和b
3)入列:往stack1中插入d元素
4)出列:此时stack2中依然有元素c,那么c比d先入列,则c应该比d先出列,所以此时出列元素为c
5)出列:此时stack2中没有元素,那么stack1中有元素d出栈压入stack2,stack2中的元素d弹出(即出列)。
由以上例子我们可以得出以下结论:
以stack1为入列栈,入列的元素插入stack1中,以stack2为出列栈,出列时做以下判断
a 若stack2为空,那么将stack1中的数据出栈压入stack2
b 再判断stack2是否为空,若不为空,那么stack2中元素弹出(出列),若为空则提示队列为空
下面仅给出关键代码,详细代码请 点击下载源码
代码如下:
public class CQueue {
private StackM stack1,stack2;
public CQueue(){
stack1 = new StackM(10);
stack2 = new StackM(10);
}
//元素入列
public void appendTail(long elem){
if(stack1.isFull()){
System.out.println("已经满栈了");
}else{
stack1.push(elem);
System.out.println(elem+"入列了");
}
}
//元素出列
public long deletedHead(){
//若stack2为空,则stack1中元素弹出压入stack2中
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
long elem = stack1.pop();
System.out.println(elem+"入Stack2");
stack2.push(elem);
}
}
//执行完以上操作后,stack2依然为空则返回-1代表空栈
if(stack2.isEmpty()){
return -1;
}else{
return stack2.pop();
}
}
public boolean isQueueEmpty(){
return stack2.isEmpty()&&stack1.isEmpty();
}
}
/**
* 定义了一个顺序存储结构栈
* @author szh1840836
*
*/
public class StackM {
private int maxSize; //栈的最大值
private long[] stackArray; //栈的元素数组
private int top; //栈顶
public StackM(int maxSize){
this.maxSize = maxSize;
stackArray = new long[maxSize];
top = -1; //目前为空栈
}
//入栈
public void push(long elem){
stackArray[++top] = elem;
}
//出栈
public long pop(){
return stackArray[top--];
}
//是否空栈
public boolean isEmpty(){
return top==-1;
}
//获取栈顶元素
public long getTop(){
return stackArray[top];
}
//是否满栈
public boolean isFull(){
return top == maxSize-1;
}
}
以下为源码,欢迎下载 点击下载源码