面试题:通过栈实现队列

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

解题思路:

设置两个栈s1和s2,s1用来存储入队的元素s2用来实现出队方法

1.入队方法的实现():将待入队的元素通过s1的压栈操作尾插到s1中。

2.出队方法的实现(pop):

出队之前,判断两个栈(s1和s2)是否都为空,为空,返回-1;

如果s2为空,将s1中的所有元素通过出栈操作压入s2中(循环条件为s1不为空),待全部压入完后,通过poll(出栈)操作返回s2的栈顶元素;

3.获取队头元素(peek):

跟出队操作类似,但唯一不同的是最后返回的是栈的peek()方法。

实现步骤:

1.通过压栈将x压入栈s1中实现入队操作。

class ArrayQueue{
    //声明两个栈
   public ArrayDeque<Integer> stack1;
   public ArrayDeque<Integer> stack2;

   public ArrayQueue(){
       //对栈进行初始化
       stack1 = new ArrayDeque<>();
       stack2 = new ArrayDeque<>();

   }

2。出队方法的实现:

public int pop(){
       //出队列操作
       if(empty()){
           return -1;
       }
       while(stack2.isEmpty()){ //若stack2为空,将stack1中的元素全部为尾插到stack2中
           while(!stack1.isEmpty()){
               stack2.push(stack1.pop());
           }
           return stack2.pop();
       }
   }

3.peek方法的实现:

和出队列类似

具体代码如下:

public int peek() {
      if (empty()) {
          return -1;
      }
      while (stack2.isEmpty()) {
          while (!stack1.isEmpty()) {
              stack2.push(stack1.pop());
          }

      }
      return stack2.peek(); //和pop类似,但要将stack返回的值改为peek。
  }

最后empty方法

 public boolean empty(){
       return stack1.isEmpty() && stack2.isEmpty(); //s1与s2均不为空
   }

结语:

今天的题目讲解结束,喜欢的朋友可以点个赞!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值