栈A和栈B ,A\B容量为N,队列的大小为2N。 需要注意的是:入栈的元素插入A中(<N时),出栈时从B中。 遵循原则:1:出队在B中,当B为空时,若A不空,则将A中的元素全部插入B中进行出队。 2 入队在A中,当A满后,若B空,则将A中所有元素插入B中,之后再入队。(疑问,如果A满,而B非空,又不执行del,操作,那么就进行不下去了么,此时不能再入栈了) 3 只有B中为空时,才能将A中的元素插入B中,且必须全部插入B中。
import java.util.Stack; public class MyQueue { public static Stack<Integer> sa=new Stack<Integer>(); public static Stack<Integer> sb=new Stack<Integer>(); public static int atop=0; public static int btop=0; //考虑栈A、B的大小都为n=15; public static int n=15; public static boolean isEmpty() { if(sa.isEmpty()&&sb.isEmpty()) return true; else return false; } public static int getSize() { return atop+btop; } public static void EnQueue(int x) { int xp; //入栈是在栈A中进行,需要注意的是,当A中元素满,若栈B为空时,需要将A中的元素都 if(atop<n) //栈A未满,直接插入,移动栈顶 { sa.add(x); atop++; //假设,栈空,atop指在0 System.out.println("此时入队元素为:"+x); } else //栈A满,若栈B空,则将A中所有元素pop,在push如B中,再进行插入操作 { if(sb.isEmpty()) { while(!sa.isEmpty()) { xp=sa.pop(); atop--; //出栈,指针移动 sb.add(xp); btop++; // } sa.add(x); atop++; System.out.println("此时入队元素为:"+x); } else // 若A满,B可能不满,但也不可以执行插入操作 { System.out.println("此时不能执行插入操作"); } }
} public static void DeQueue() { int xp; int xq; if(sb.isEmpty()) //栈B空 { if(sa.isEmpty()) //这样两个都空,则表示栈空,不能执行出栈操作 { System.out.println("栈空,此时不能执行出栈操作"); } else // A栈不空,则将A栈元素全部插入B栈中,再出栈【不能执行插入操作时的队列最多含有n+1个元素】 { while(!sa.isEmpty()) { xp=sa.pop(); atop--; sb.push(xp); btop++; } xq=sb.pop(); btop--; System.out.println("此时出队元素为:"+xq); } } else { xq=sb.pop(); btop--; System.out.println("此时出队元素为:"+xq); } } public static void main(String args[]) { EnQueue(1); EnQueue(3); EnQueue(6); EnQueue(7); EnQueue(12); EnQueue(18); EnQueue(14);
DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); System.out.println(sa.isEmpty()); System.out.println(sa.size()); System.out.println(sb.isEmpty()); System.out.println(sb.size()); System.out.println(isEmpty());
EnQueue(1); EnQueue(3); EnQueue(6); EnQueue(7); EnQueue(12); EnQueue(18); EnQueue(14); EnQueue(1); EnQueue(3); EnQueue(6); EnQueue(7); EnQueue(12); EnQueue(18); EnQueue(14); EnQueue(1);//15 EnQueue(3); EnQueue(6); EnQueue(7); EnQueue(111); EnQueue(17); EnQueue(16); EnQueue(1); EnQueue(3); EnQueue(6); EnQueue(7); EnQueue(111); EnQueue(17); EnQueue(16); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); DeQueue(); EnQueue(1); EnQueue(3); // 这是最后一个元素,此时栈中已经满了 EnQueue(6); EnQueue(7); EnQueue(111); EnQueue(17); EnQueue(16); System.out.println(sa.isEmpty()); System.out.println(sa.size()); System.out.println(sb.isEmpty()); System.out.println(sb.size()); System.out.println(atop); System.out.println(btop); System.out.println(getSize()); }
} |
两个栈形成一个队列的JAVA实现
最新推荐文章于 2023-04-05 16:43:53 发布