栈和队列是计算机编程中常用的数据结构,通过使用数据结构,可以在逻辑上模拟数据的存储方式和构造该方式上的方法,从而达到简化编程的效果.
栈是一种具有后进先出特性(FILO)的数据结构,数据域包括栈顶(top)、栈底、栈空间大小(maxsize),行为包括出栈(pop())、入栈(push())、栈空(empty())、栈满(full())等
队列是一种具有先进先出特性(FIFO)的数据结构,数据域包括队头(front),队尾(rear),队空间(maxsize),行为包括进队(EnQueue())、出队(DeQueue())、队空(empty())、栈队(full())等
要实现由两个栈组成的队列,首先要知道栈和队列的特性,其次是根据它们的特性进行算法设计,最后进行代码实现。 由于栈的LIFO特性,容易想到要实现队列,只需要将栈进行两次入栈操作即可达到队列FIFO的特性。
设计算法时要注意 - 如果弹入栈要往弹出栈压入元素,那么必须一次性把弹入栈元素中的数据全部压入。 - 如果弹出栈不为空,弹入栈据对不能向弹出栈压入数据。 以上两点避免的队列的顺序混乱。
具体代码实现如下所示
class TwoStackQuene {
public Stack stackPush;//弹进栈
public Stack stackPop;//弹出栈
public TwoStackQuene(){
stackPush=new Stack();
stackPop=new Stack();
}//构造器初始化弹进、弹出栈
public void add(int pushInt){
stackPush.push(pushInt);
}//重写进栈方法
//重写poll()方法
public int poll(){
if(stackPop.empty()&&stackPush.empty()){
throw new RuntimeException("queue is empty!!!");//检测弹进、弹出栈是否为空,若为空则抛出异常。
}else if(stackPop.empty()){
while(!stackPush.empty()){
stackPop.push(stackPush.pop());/*若弹出栈为空,弹进栈不为空,将弹进栈元素弹入弹出栈。*/
}
}
return stackPop.pop();//弹出弹出栈栈顶元素
}
//重写peek()方法,peek方法跟poll方法类似,在此不进行注释
public int peek(){
if(stackPop.empty()&&stackPush.empty()){
throw new RuntimeException("Queue is empty!!!");
}else if(stackPop.empty()){
while(!stackPush.empty()){
stackPop.push(stackPush.pop());
}
}
return stackPop.peek();
}
}
上述代码经测试,成功编译,无差错。
实现效果如下