题目:用两个栈实现队列
队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
算法分析:
我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空。
这个时候,我们试着删除从队列中删除一个元素。按照队列先入先出的规则,由于a比b、c先插入到队列中,最先被删除的元素应该是a。元素a存储在stack1中,但并不在占顶上,因此不能直接被删除。注意到stack2我们还一直没有使用过,现在是让stack2发挥作用的时候了。如果我们把stack1中的元素逐个弹出并压入stack2,元素在stack2中的顺序正好和原来的stack1中的顺序相反。因此经过3次弹出stack1和压入stack2操作之后,stack1为空,而stack2中的元素是{c,b,a},这个时候就可以弹出stack2的栈顶a了。此时的stack1为空,而stack2的元素为{c,b},其中在栈顶,如图所示:
算法源程序:
/**************************************************************
* Copyright (c) 2016, 北京邮电大学
* All rights reserved.
* 版 本 号:v1.0
* 题目描述:用两个栈实现队列
* 队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
* 输入描述:请输入要插入到栈中的内容,以空格隔开:
* 1 3 5 7 9
* 程序输出: 两个栈实现队列的结果为:
* 1 3 5 7 9
* 问题分析:无
* 算法描述: 我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},
* stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空。
* 这个时候,我们试着删除从队列中删除一个元素。按照队列先入先出的规则,由于a比b、c先插入到队列中,
* 最先被删除的元素应该是a。元素a存储在stack1中,但并不在占顶上,因此不能直接被删除。
* 注意到stack2我们还一直没有使用过,现在是让stack2发挥作用的时候了。如果我们把stack1中的元素逐个弹出并压入stack2,
* 元素在stack2中的顺序正好和原来的stack1中的顺序相反。因此经过3次弹出stack1和压入stack2操作之后,
* stack1为空,而stack2中的元素是{c,b,a},这个时候就可以弹出stack2的栈顶a了。
* 此时的stack1为空,而stack2的元素为{c,b},其中在栈顶
* 完成时间:2016-10-30
***************************************************************/
package org.marsguo.offerproject07;
import java.util.Scanner;
import java.util.Stack;
class SolutionMethod1{
Stack<Integer> stack1 = new Stack<Integer>(); //插入栈,用于插入数据
Stack<Integer> stack2 = new Stack<Integer>(); //弹出栈,用于弹出数据
public void StackPush(int[] arr){
for(int i = 0; i < arr.length; i++){
stack1.push(arr[i]);
}
}
public int StackPop(){
if(stack1.isEmpty() && stack2.isEmpty()){
throw new RuntimeException("Queue is Empty");
}
if(stack2.empty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop()); //将stack1出栈的内容压入stack2中
}
}
return stack2.pop();
}
}
/*
算法2.采用模板类来创建,这样输入队列中的数据就可以是任意类型的
*/
class SolutionMethod2{
public class MList<T>{
public Stack<T> stack1 = new Stack<>();
public Stack<T> stack2 = new Stack<>();
public MList(){
}
public void appendTail(T t){
stack1.add(t); //在队列尾部插入节点
}
public T deleteHead(){
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.add(stack1.pop());
}
}
if(stack2.isEmpty()){
throw new RuntimeException("NO more element");
}
return stack2.pop();
}
}
}
public class StackToQueue {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要插入到栈中的内容,以空格隔开:");
String str = scanner.nextLine();
String[] temp = str.split(" ");
int[] array = new int[temp.length];
for(int i = 0;i < temp.length;i++)
{
array[i] = Integer.parseInt(temp[i]);
}
scanner.close();
SolutionMethod1 solution1 = new SolutionMethod1();
System.out.println("两个栈实现队列的结果为:");
solution1.StackPush(array);
System.out.print(solution1.StackPop() + " ");
while(!solution1.stack2.isEmpty()){
System.out.print(solution1.StackPop() + " ");
}
//System.out.println(solution1.StackPop());
/*for(int i = 0; i < array.length; i++){
solution1.StackPush(array[i]);
}*/
}
}
程序运行结果: