算法系列之栈和队列(二):用栈实现一个队列,要求可以实现队列的基本操作

简介: 需要实现一个类,使用两个栈实现队列的基本操作,包括add、poll、peek。

一、题目

需要实现一个类,使用两个栈实现队列的基本操作,包括add、poll、peek。

二、分析

栈的特性是先入后出,队列的特点是先入先出。所以设计的时候两个栈中,一个负责数据压入,一个负责数据弹出。当数据弹出的时候必须从弹出堆栈中进行统一弹出,同时在数据弹出之前,必须将数据压入堆栈中的数据全部压入弹出堆栈中。因为如果不是全部压入的话,在弹出的过程中就会破坏队列要求的先入先出的顺序。同时当弹出堆栈存在数据的时候不能进行数据压入操作,因为弹出堆栈中已经是上一次数据的压入顺序,如果在此时进行数据的压入也会破坏弹出顺序。

三、代码实现

package com.algorithm;
import java.util.Stack;
import com.exception.ProgramException;
/**
 * @author taomeng
 * @Date 2018年9月8日
 * @Discription:两个栈实现队列功能
 */
public class NewQueue {
    /**
     * 数据压入
     */
    private Stack<Integer> stack1;
    /**
     * 数据弹出
     */
    private Stack<Integer> stack2;
    public NewQueue() {
        this.stack1 = new Stack<Integer>();
        this.stack2 = new Stack<Integer>();
    }
    /**
     * 
     * 函数功能描述:队列添加数据
     * @date 2018年9月8日下午3:54:18
     * @param data void
     * @author taomeng
     */
    public void add(Integer data) {
        stack1.push(data);
    }
    /**
     * 
     * 函数功能描述:返回头部元素并移除
     * @date 2018年9月8日下午4:21:12
     * @return int
     * @author taomeng
     */
    public int poll() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            throw new ProgramException("queue is empty.");
        } else if (stack2.isEmpty()) {
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }   
        }
        return stack2.pop();    
    }
    /**
     * 
     * 函数功能描述:数据弹出,返回头部元素
     * @date 2018年9月8日下午4:44:12
     * @return int
     * @author taomeng
     */
    public int peek() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            throw new ProgramException("queue is empty.");
        } else if (stack2.isEmpty()) {
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }       
        return stack2.peek();
    }
}
相关文章
|
25天前
|
算法
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
139 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
59 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
84 3
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
39 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
4月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
3月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
5月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
5月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
30 0

热门文章

最新文章