这是悦乐书的第193次更新,第198篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第54题(顺位题号是225)。使用队列实现栈的以下操作:

push(x) - 将元素x推入栈。

pop() - 删除栈顶部的元素。

top() - 获取顶部元素。

empty() - 返回栈是否为空。

例如:

MyStack stack = new MyStack();

stack.push(1);

stack.push(2);

stack.top(); //返回2

stack.pop(); //返回2

stack.empty(); //返回false

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

借助ArrayList。进栈利用list的add方法。出栈时先获取list最后一位元素存起来,然后再删除最后一位元素,再返回先前存起来的最后一位元素。获取栈顶时,返回list最后一位元素即可。判空可以直接利用list的isEmpty方法。

class MyStack {
List<Integer> list = null;
/** Initialize your data structure here. */
public MyStack() {
list = new ArrayList<Integer>();
} /** Push element x onto stack. */
public void push(int x) {
list.add(x);
} /** Removes the element on top of the stack and returns that element. */
public int pop() {
int top = list.get(list.size()-1);
list.remove(list.size()-1);
return top;
} /** Get the top element. */
public int top() {
return list.get(list.size()-1);
} /** Returns whether the stack is empty. */
public boolean empty() {
return list.isEmpty();
}
}

03 第二种解法

利用队列。

进栈直接使用queue的add方法或者offer方法。

出栈时,因为队列是先进先出的特性,所以需要先把队列里的元素poll出来再add进去,但是此操作只能进行queue的size-1次,比如:进栈顺序是1->2->3,进行一次出队列再进队列操作后,2->3->1,再进行一次出队列再进队列的操作,3->1->2,如果你再操作一次就还原了,所以只能操作queue的size-1次。最后再使用队列的poll方法,实现出栈。

栈顶,和出栈的思路一样,不过在把队列里的元素poll出来再add进去size-1次后,先要将顶获取到,可以直接使用队列的peek方法,然后再来一次poll出来再add进去,就把队列元素的顺序还原了。方便下次操作。

判空可以直接使用队列自身的isEmpty方法。

class MyStack2 {

    Queue<Integer> queue = null;
int size ; /** Initialize your data structure here. */
public MyStack2() {
queue = new LinkedList<Integer>();
size = 0;
} /** Push element x onto stack. */
public void push(int x) {
queue.add(x);
size++;
} /** Removes the element on top of the stack and returns that element. */
public int pop() {
for (int i=1; i<size; i++) {
queue.add(queue.poll());
}
size--;
return queue.poll();
} /** Get the top element. */
public int top() {
for (int i=1; i<size; i++) {
queue.add(queue.poll());
}
int res = queue.peek();
queue.add(queue.poll());
return res;
} /** Returns whether the stack is empty. */
public boolean empty() {
return queue.isEmpty();
}
}

04 第三种解法

还是使用队列。不过此解法除了入栈重新实现外,其他的出栈、栈顶、判空都是使用了队列的方法,所以重点讲下入栈即可。

入栈时,首先利用队列的add方法,然后利用循环,把队列里的元素poll出来再add进去,此循环只执行队列的size-1次,执行size次会还原。

class MyStack3 {

    Queue<Integer> queue = null;

    /** Initialize your data structure here. */
public MyStack3() {
queue = new LinkedList<Integer>();
} /** Push element x onto stack. */
public void push(int x) {
queue.add(x);
for (int i=0; i<queue.size()-1; i++) {
queue.add(queue.poll());
}
} /** Removes the element on top of the stack and returns that element. */
public int pop() {
return queue.poll();
} /** Get the top element. */
public int top() {
return queue.peek();
} /** Returns whether the stack is empty. */
public boolean empty() {
return queue.isEmpty();
}
}

05 小结

算法专题目前已连续日更超过一个月,算法题文章54+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Implement Stack Using Queues的更多相关文章

  1. LeetCode算法题-Implement Queue Using Stacks(Java实现)

    这是悦乐书的第195次更新,第201篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第57题(顺位题号是232).使用栈实现队列的以下操作. push(x) - 将元素x推 ...

  2. LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  3. 【算法】LeetCode算法题-Implement strStr

    这是悦乐书的第151次更新,第153篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第10题(顺位题号是28).给定两个任意字符串haystack.needle,返回hay ...

  4. 【LeetCode】225. Implement Stack using Queues

    题目: Implement the following operations of a stack using queues. push(x) -- Push element x onto stack ...

  5. 【一天一道LeetCode】#225. Implement Stack using Queues

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Impleme ...

  6. LeetCode OJ:Implement Stack using Queues(队列实现栈)

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  7. 【LeetCode】225. Implement Stack using Queues 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. leetcode:Implement Stack using Queues 与 Implement Queue using Stacks

    一.Implement Stack using Queues Implement the following operations of a stack using queues. push(x) - ...

  9. 【LeetCode】232 & 225 - Implement Queue using Stacks & Implement Stack using Queues

    232 - Implement Queue using Stacks Implement the following operations of a queue using stacks. push( ...

随机推荐

  1. 爬虫之抓取js生成的数据

    有很多页面,当我们用request发送请求,返回的内容里面并没有页面上显示的数据,主要有两种情况,一是通过ajax异步发送请求,得到响应把数据放入页面中,对于这种情况,我们可以查看关于ajax的请求, ...

  2. [转]Ubuntu18.04下使用Docker Registry快速搭建私有镜像仓库

    本文转自:https://blog.csdn.net/BigData_Mining/article/details/88233015 1.背景 在 Docker 中,当我们执行 docker pull ...

  3. Redis常用命令与配置

    常用命令 测试客户端与服务器是否正常连接:ping   ( 补:返回pong表示成功 ) 正则获取键:keys pattern 判断一个键是否存在:exists key 删除一个键:del key 获 ...

  4. C#一个窗体调用另一个窗体的方法

    一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static  FormA   m_formA; //设此窗体为静态,其他窗体可调用此 ...

  5. [android] smartimageview&常见的开源代码

    github上搜索开源框架android-smarty-imageview,下载压缩包,拷贝我们之前写的网络图片查看器布局. 解压下载包里面的数据,找到java源码拷贝到我们的项目里,这时我们可以看到 ...

  6. Base64字符保存图片,图片转换成Base64字符编码

    //文件转换成Base64编码 public static String getFileBase64Str(String filePath) throws IOException { String f ...

  7. python文件

    目录 1. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 2. 文件的基本操作 2.1 操作文件的套路 2.2 操作文件的函数/方法 2.3 read 方法 -- 读取文件 2.4 打 ...

  8. 使用virtualenv进行python环境隔离

    按照以下步骤安装 TensorFlow: 1.打开终端(一个 shell),你将在这个终端中执行随后的步骤 2.通过以下命令安装 pip 和 virtualenv sudo easy_install ...

  9. Hibernate入门(八)级联保存或更新(含问题在末尾,求大佬指点..)

    级联保存或更新CASCADE 级联保存或更新: 作用就是:保存一方的数据的时候,会把关联的对象也同时保存. 级联保存或更新的配置: 属性名:cascade 属性值: 1.none:所有情况下均不进行关 ...

  10. Android Studio添加Activity时Resolved versions for app (21.0.3) and test app (25.4.0) differ.

    将以下代码添加到gradle(module) dependencise中 androidTestCompile 'com.android.support:support-annotations:xx. ...