`

栈与队列Queue

 
阅读更多
http://yongsky.iteye.com/blog/128549

一、Java队列:
队列是设计程序中常用的一种数据结构。它类似日常生活中的排队现象,采用一种被称为“先进先出”(LIFO)的存储结构。数据元素只能从队尾进入,从队首取出。在队列中,数据元素的次序不会改变。每当有数据元素从队列中被取出,后面的数据元素依次向前移动一位。
LinkedList,即是数据结构中的Queue,内部实现是链表形式,队列主要的方法为:
1.插入:public boolean offer(E e)将指定元素添加到此列表的末尾(最后一个元素)
2.获取头元素,但不移除:public E peek()获取但不移除此列表的头(第一个元素)
3.获取头元素,而且移除:public E poll()获取并移除此列表的头(第一个元素)
4.判断是否为空:public boolean isEmpty()如果此 collection 不包含元素,则返回 true

二、用Vector快速实现JAVA的队列类
根据这些特点,对队列定义了以下六种操作:
  enq(x) 向队列插入一个值为x的元素;
  deq() 从队列删除一个元素;
  front() 从队列中读一个元素,但队列保持不变;
  empty() 判断队列是否为空,空则返回真;
  clear() 清空队列;
  search(x) 查找距队首最近的元素的位置,若不存在,返回-1。
  Vector类是JAVA中专门负责处理对象元素有序存储和任意增删的类,因此,用Vector可以快速实现JAVA的队列类。
  
      public class Queue extends java.util.Vector {
  public Queue() {
  super();
  }
  public synchronized void enq(Object x) {
  super.addElement(x);
  }
  public synchronized Object deq() {
  /* 队列若为空,引发EmptyQueueException异常 */
  if( this.empty() )
  throw new EmptyQueueException();
  Object x = super.elementAt(0);
  super.removeElementAt(0);
  return x;
  }
  public synchronized Object front() {
  if( this.empty() )
  throw new EmptyQueueException();
  return super.elementAt(0);
  }
  public boolean empty() {
  return super.isEmpty();
  }
  public synchronized void clear() {
  super.removeAllElements();
  }
  public int search(Object x) {
  return super.indexOf(x);
  }
  }
  public class EmptyQueueException extends java.lang.RuntimeException {
  public EmptyQueueException() {
  super();
  }
  }

三、栈与队列
(1)栈
package ChapterOne;
public class Stack {
//栈数组
long stackArr[];
//栈的大小
int maxSize;
//栈的顶部
int top;
//初始化一个大小为size的栈
public Stack(int size){
maxSize = size;
stackArr = new long[size];
top = -1;
}
//出栈操作
public long pop(){
return stackArr[top--];
}
//进栈操作
public void push(long value){
stackArr[++top] = value;
}
//判断栈是否为空
public boolean isEmpty(){
return top == -1;
}
//判断栈是否已满
public boolean isFull(){
return top == maxSize-1;
}
//取栈顶元素
public long peek(){
return stackArr[top];
}
public static void main(String[] args) {
Stack stack = new Stack(10);
while(!stack.isFull()){
long v = (long) (Math.random()*100);
stack.push(v);
System.out.print(v+" ");
}
System.out.println();
while(!stack.isEmpty()){
long topValue = stack.pop();
System.out.print(topValue+" ");
}
System.out.println();
}
}

(2)队列
package ChapterOne;

public class Queue {
//队列数组
private long queueArr[];
//队列的前端下标
private int front;
//队列的尾端下标
private int rear;
//队列的大小
private int maxSize;
//队列中元素的个数
private int nItems;
//初始化一个大小为size的队列
public Queue(int size){
queueArr = new long[size];
maxSize = size;
front = 0;
rear = -1;
nItems = 0;
}
//插入操作
public void insert(long value){
//队列已满
if(rear == maxSize-1)
rear = -1;
queueArr[++rear] = value;
nItems++;
}
//删除操作
public long remove(){
long temp = queueArr[front++];
if(front == maxSize)
front = 0;
nItems--;
return temp;
}
//返回队列第一个元素
public long peakFront(){
return queueArr[front];
}
//判断是否为空
public boolean isEmpty(){
return nItems == 0;
}
//判断是否已满
public boolean isFull(){
return nItems == maxSize;
}
//返回队列中元素的个数
public int size(){
return nItems;
}

public void print(){
for(int i = front;i < front+nItems;i++){
System.out.print(queueArr[i]+" ");
}
System.out.println();
}

public static void main(String[] args) {
Queue q = new Queue(10);
while(!q.isFull()){
long value = (long)(Math.random()*100);
q.insert(value);
}
q.print();
while(!q.isEmpty()){
q.remove();
q.print();
}
q.print();
System.out.println(q.isEmpty());
}
}

(3)优先队列
package ChapterOne;

public class PriorityQueue {

private int nItems;

private long pqArr[];

private int maxSize;

public PriorityQueue(int size){
maxSize = size;
pqArr = new long[size];
nItems = 0;
}

public void insert(long value){
int i;
if(nItems == 0)
pqArr[nItems++] = value;
else{
for(i = nItems-1;i >= 0;i--){
if(value < pqArr[i]){
pqArr[i+1] = pqArr[i];
}
else
break;
}
pqArr[i+1] = value;
nItems++;
}
}

public long remove(){
return pqArr[--nItems];
}

public boolean isEmpty(){
return nItems == 0;
}

public boolean isFull(){
return nItems == maxSize;
}

public void print(){
for(int i = 0;i < nItems;i++)
System.out.print(pqArr[i]+" ");
System.out.println();
}

public static void main(String[] args) {
PriorityQueue pq = new PriorityQueue(10);
while(!pq.isFull()){
long value = (long)(Math.random()*100);
pq.insert(value);
}
pq.print();
}
}
分享到:
评论

相关推荐

    C语言实现栈与队列

    在IT领域,数据结构是编程基础中的重要组成部分,而栈(Stack)和队列(Queue)是最基础且广泛使用的两种数据结构。本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作...

    栈和队列源代码

    在计算机科学中,栈和队列是两种基本的数据结构,它们在编程中有着广泛的应用。栈被称为“后进先出”(LIFO, Last In First Out)数据结构,而队列则是“先进先出”(FIFO, First In First Out)数据结构。这两种...

    数据结构实验报告《二、栈和队列的运用》

    其中,栈(Stack)和队列(Queue)是最基本的数据结构之一,分别基于“后进先出”(LIFO, Last In, First Out)和“先进先出”(FIFO, First In, First Out)的原则工作。 **栈**是一种线性数据结构,只允许在一端...

    用栈和队列编写的停车管理系统

    ### 栈与队列的基础概念 #### 栈(Stack) 栈是一种线性数据结构,其特点是遵循“先进后出”(First In Last Out, FILO)的原则。这意味着最后一个进入栈的数据项将会是第一个被取出的。在栈中,主要的操作包括`...

    栈与队列的基本操作与实现

    **队列(Queue)**,则是一种先进先出(First In, First Out,简称FIFO)结构。队列的主要操作包括: 1. **入队(Enqueue)**:在队尾添加一个元素。 2. **出队(Dequeue)**:移除队首元素并返回其值。 3. **查看队...

    栈和队列的基本操作实现及其应用实验报告

    ### 栈和队列的基本操作实现及其应用实验报告 #### 实验目的 1. **熟练掌握栈和队列的基本操作**:在数组和链表两种存储结构上实现栈和队列的基本操作。 2. **应用栈和队列解决实际问题**:通过具体的编程练习,...

    回文判断程序栈和队列基本操作

    首先,我们来了解一下栈(Stack)和队列(Queue)。栈是一种后进先出(Last In, First Out, LIFO)的数据结构,就像一个堆叠的盘子,新添加的盘子总是在最上面,要取出盘子必须先移除上面的。在回文判断中,我们可以...

    java 栈和队列的小例子

    在Java编程语言中,栈(Stack)和队列(Queue)是两种基本的数据结构,它们在处理数据存储和操作方面有着广泛的应用。本教程将通过一些小例子来深入理解这两种数据结构及其在Java中的实现。 栈是一种后进先出(LIFO...

    栈和队列 实验报告

    - 实现栈和队列操作的函数,如push_stack()、pop_stack()、peek_stack()、print_stack(),以及enqueue()、dequeue()、peek_queue()、print_queue()。 六、运行过程 在成功编译代码后,运行程序,分别进行顺序栈和...

    数据结构试验2-栈和队列实验报告含源码

    队列(Queue)则是先进先出(FIFO,First In First Out)的数据结构,就像银行的排队系统,最早到达的人最先服务。队列广泛应用于任务调度、打印任务、多线程环境中的同步等。同样,队列可以用数组或链表来实现,...

    C语言 栈和队列 栈和队列是两种特殊的线性表,是操作受限的线性表,称限定性DS

    在计算机科学和编程中,栈和队列的应用非常广泛,它们是实现许多高级数据结构和算法的基础,如堆栈、队列、双端队列(deque)、优先队列(priority queue)等。理解并熟练掌握栈和队列的概念及其操作,对于编写高效...

    链表实现栈和队列(经典程序)

    本话题主要探讨如何使用链表来实现栈和队列这两种基本的数据结构。链表是一种动态数据结构,它允许在运行时添加或删除元素,而无需预先确定其大小。这使得链表成为实现栈和队列的理想选择。 栈是一种后进先出(LIFO...

    数据结构 栈和队列PPT

    栈和队列是两种基础且重要的数据结构,广泛应用于各种算法和程序设计中。本课件及课堂笔记将深入探讨这两种数据结构的概念、特性以及它们在实际问题中的应用。 栈(Stack)是一种后进先出(LIFO,Last In First Out...

    数据结构实验报告2-栈与队列-队列基本操作算法-实验内容及要求.docx

    - 采用队头/队尾间隔至少一个空闲元素的方法实现循环队列,这样可以避免队列的物理连续性与逻辑连续性的混淆,同时便于检测队列是否为空或满。 - 当队列为满时尝试执行入队操作,或者队列为时空执行出队操作时,...

    栈和队列的代码

    栈和队列是两种基本的数据结构,它们在计算机科学中有着广泛的应用,特别是在算法和数据处理方面。在编程中,理解和掌握栈和队列的实现是至关重要的。 栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据...

    Queue_栈队列_pop_

    任务描述栈和队列都提供 Push/Pop 两... 输出描述对每组测试数据输出一行, 输出该组数据对应的线性结构,若为栈则输出”Stack”,若为队列则输出“Queue”,若两者都是则输出“Both”,若两者都不是则输出“Error”。

    栈和队列基本操作及练习

    在本主题中,我们将深入探讨栈与队列的基本概念、操作以及相关的练习问题。 栈(Stack)是一种“后进先出”(Last In First Out, LIFO)的数据结构。它的主要操作包括压入(Push)、弹出(Pop)和查看栈顶元素...

    栈与队列ppt及代码

    本资料包“栈与队列ppt及代码”提供了关于这两种数据结构的深入理解,包括它们的概念、实现方式以及在实际问题中的应用,特别适合准备面试或提升编程技能的IT从业者。 首先,栈(Stack)是一种后进先出(LIFO,Last...

    数据结构 第三章 栈与队列 数据结构 第三章 栈与队列

    数据结构中的栈与队列是两种非常基础且重要的数据结构,它们在计算机科学和编程中扮演着不可或缺的角色。本章将深入探讨这两个概念,以及如何在实际问题中运用它们。 首先,栈(Stack)是一种遵循“后进先出”...

Global site tag (gtag.js) - Google Analytics