【剑指offer面试题9】用两个栈实现队列和用两个队列实现栈

用两个栈实现队列

关键想法:

插入时: 只向栈1顶部插入

删除时:
如果栈2内有元素,就优先弹出栈2的栈顶元素;
否则将栈1内元素依次出栈压入栈2,然后再弹出栈2的栈顶元素

实例代码

public class Test9
{
 Stack<Character> stack1;
 Stack<Character> stack2;
 public Test9() {
  // TODO Auto-generated constructor stub
  stack1=new Stack<>();
  stack2 = new Stack<>();
 }
 
 public void  insert(char a)
 {
  stack1.push(a);
  System.out.println("插入了"+a);
  
 }
 public void deleteFromTop()
 {
 
  if (stack2.isEmpty()) 
  {
   while (!stack1.isEmpty()) 
   {
    char temp = stack1.pop();
    stack2.push(temp);
   }
   
  }
  
System.out.println("删除了"+stack2.pop());
  
  
  
 }
 

main函数中测试:

public static void main(String[] args) 
 {
  Test9 t9 = new Test9();

  t9.insert('a');
  t9.insert('b');
  t9.insert('c');
  t9.insert('d');
  t9.insert('e');
  t9.insert('f');
  t9.insert('g');
  t9.deleteAtTop();
  
 }

测试结果:
在这里插入图片描述

归还给# 用两个队列实现栈
关键想法:
把插入放在一个对队列内,删除放在另外一个队列内,这样就不用在此判断哪个队列是有元素的哪个队列是没元素的。插入时,我们只往队列1中插入,删除时,我们将队列1中的元素依次放入队列2中只留下最后一个,然后删除它。删除结束时,再将所有元素归还给队列1.

实例代码:

public class Test9_1 
{
 Queue<Character> queue1;
 Queue<Character> queue2;
 
 public Test9_1() 
 {
  // TODO Auto-generated constructor stub
  queue1 = new LinkedList<>();
  queue2 = new LinkedList<>();
 }
 public void insert(char a)
 {
  System.out.println("插入了"+a);
  queue1.offer(a);
  
 }
 public void delete()
 {
  int length = queue1.size();
  for(int i=0;i<length-1;i++)
  {
   char temp = queue1.poll();
   queue2.offer(temp);
  }
  System.out.println("删除了"+queue1.poll());
  for(int i=0;i<length-1;i++)
  {
   char temp = queue2.poll();
   queue1.offer(temp);
  }
  
 }
 
}

main方法中测试:

public static void main(String[] args) 
 {
  Test9_1 t9 = new Test9_1();
  t9.insert('a');
  t9.insert('b');
  t9.insert('c');
  t9.insert('d');
  t9.insert('e');
  t9.insert('f');
  
  t9.delete();
  t9.delete();
  
 }

测试结果:

在这里插入图片描述
简单案例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值