如何用两个栈实现队列
Posted 夏芷雨涵梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用两个栈实现队列相关的知识,希望对你有一定的参考价值。
题目内容:如何用两个栈实现队列?
思路分析:栈是先进后出的,队列是先进先出的。整体的思路是将一个栈1当做主要的存储空间,而将栈2当做缓冲区。入栈的时候先对栈1进行判断,看其是否为空,如果为空的话,将栈2的元素全部移到栈1中,然后再将新的元素入栈1,不为空的话直接入栈。出栈的时候,先判断两个栈是否都为空,如果都为空就返回提示信息,否则判断栈2是否为空如果不为空证明上次操作是出栈,继续从栈2出栈即可, 如果栈2为空,那么元素都在栈1中,将栈1的元素出栈移动到栈2中,当栈1中剩下最后的一个元素时,直接让其出栈,不需要将其移到栈2 再出栈,这样就达到了先进先出的队列要求。
源码:
import java.util.Stack;
/*
* created by 夏晓林 in 2019/8/5/005 at 21:09
* 用两个栈组成一个队列
*/
public class StackQueue<E>
Stack stack1 = new Stack();
Stack stack2 = new Stack();
public void into(E n)
if (!stack1.empty())
System.out.println("进队元素"+stack1.push(n));
else
for (int i = 0; i < stack2.size(); i++)
stack1.push(stack2.pop());
System.out.println("进队元素"+stack1.push(n));
// System.out.println(stack1);
// System.out.println(stack2);
public void out()
if(stack1.empty()&&stack2.empty())
System.out.println("当前队列中为空,不能进行出队操作");
return;
if (!stack2.empty())
System.out.println("出队元素:"+stack2.pop());
else
int n=stack1.size();
for (int i = 0; i <n - 1; i++)
stack2.push(stack1.pop());
System.out.println("出队元素:"+stack1.pop());
// System.out.println(stack1);
// System.out.println(stack2);
import java.util.Scanner;
/*
* created by 夏晓林 in 2019/8/5/005 at 21:15
* 题目内容:如何用两个栈来形成一个队列?
* 思路:栈是先进后出的,队列是先进先出的。整体的思路是将一个栈1当做主要的存储空间,而将栈2当做缓冲区。入栈的时候先对
* 栈1进行判断,看其是否为空,如果为空的话,将栈2的元素全部移到栈1中,然后再将新的元素入栈1,不为空的话直接入栈。出栈的时候,先判断两个
* 栈是否都为空,如果都为空就返回提示信息,否则判断栈2是否为空如果不为空证明上次操作是出栈,继续从栈2出栈即可,
* 如果栈2为空,那么元素都在栈1中,将栈1的元素出栈移动到栈2中,当栈1中剩下最后的一个元素时,直接让其出栈,不需要将其移到栈2
* 再出栈,这样就达到了先进先出的队列要求。
*/
public class Test
public static void main(String[] args)
StackQueue<Integer> stackQueue = new StackQueue<>();
boolean flag=true;
do
System.out.println("请选择进队还是出队:1【进队】2【出队】0【结束】");
Scanner input = new Scanner(System.in);
int choice = input.nextInt();
switch (choice)
case 1:
System.out.print("请输入要进队的数据:");
int num = input.nextInt();
//String num=input.next();
stackQueue.into(num);
break;
case 2:
stackQueue.out();
break;
case 0:
flag=false;
break;
default:
System.out.println("输入的操作无效");
break;
while (flag);
以上是关于如何用两个栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章