当前位置: 首页 > news >正文

面试题:通过栈实现队列

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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均不为空}

结语:

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


http://www.mrgr.cn/news/39420.html

相关文章:

  • 基于SSM+小程序的校园失物招领管理系统(失物2)(源码+sql脚本+视频导入教程+文档)
  • InnoDB 死锁
  • 【CSS Tricks】css动画详解
  • VS开发 - 静态编译和动态编译的基础实践与混用
  • Junit和枚举ENUM
  • 通信工程学习:什么是LAN局域网、MAN城域网、WAN广域网
  • java判断ip是否为指定网段
  • Spring依赖注入推荐使用构造函数注入而非@Autowired
  • 嵌入式linux系统中库函数如何提高效率
  • ServletContainerInitializer接口详解
  • Gson将对象转换为JSON(学习笔记)
  • 2、Spring Boot 3.x 集成 Feign
  • SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)
  • unixODBC编程(七)数组查询
  • 安卓app开发系列之-用户反馈和维保
  • 全局思维下的联合创新:华为携手ISV伙伴助推银行核心平稳升级
  • 【C++并发入门】摄像头帧率计算和多线程相机读取(上):并发基础概念和代码实现
  • 【保姆级教程】UMLS工具——MetaMap安装及使用
  • 低代码可视化-uniapp蓝牙标签打印-代码生成器
  • 简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值