`
manjingtou
  • 浏览: 121131 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据结构与算法(2)

阅读更多

四,栈和队列


栈只允许访问一个数据项:即最后插入的数据项.移出这个数据项后才能访问倒数第二个插入的数据项,

以此类推.这种机制在不少编程环境中都很有用.

大部分微处理器运用基于栈的体系结构.当调用一个方法时,把它的返回地址和参数压入栈,当方法结束

返回时,那些数据出栈.栈操作就嵌入在微处理器中.

package stack;

import java.io.*;

/**
 * 
 * @author jason
 * 
 */
class StackC {
 private int maxSize;

 private char[] stackArray;

 private int top;

 // --------------------------------------------------------------
 public StackC(int max) // constructor
 {
  maxSize = max;
  stackArray = new char[maxSize];
  top = -1;
 }

 // --------------------------------------------------------------
 public void push(char j) // put item on top of stack
 {
  stackArray[++top] = j;
 }

 // --------------------------------------------------------------
 public char pop() // take item from top of stack
 {
  return stackArray[top--];
 }

 // --------------------------------------------------------------
 public char peek() // peek at top of stack
 {
  return stackArray[top];
 }

 // --------------------------------------------------------------
 public boolean isEmpty() // true if stack is empty
 {
  return (top == -1);
 }
 // --------------------------------------------------------------
} // end class StackX
// //////////////////////////////////////////////////////////////

class Reverser {
 private String input; // input string

 private String output; // output string

 // --------------------------------------------------------------

 public Reverser(String in) // constructor
 {
  input = in;
 }

 // --------------------------------------------------------------
 public String doRev() // reverse the string
 {
  int stackSize = input.length(); // get max stack size
  StackC theStack = new StackC(stackSize); // make stack

  for (int j = 0; j < input.length(); j++) {
   char ch = input.charAt(j); // get a char from input
   theStack.push(ch); // push it
  }
  output = "";
  while (!theStack.isEmpty()) {
   char ch = theStack.pop(); // pop a char,
   output = output + ch; // append to output
  }
  return output;
 } // end doRev()
 // --------------------------------------------------------------
} // end class Reverser
// //////////////////////////////////////////////////////////////

class ReverseApp {
 public static void main(String[] args) throws IOException {
  String input, output;
  while (true) {
   System.out.print("Enter a string: ");
   System.out.flush();
   input = getString(); // read a string from kbd
   if (input.equals("")) // quit if [Enter]
    break;
   // make a Reverser
   Reverser theReverser = new Reverser(input);
   output = theReverser.doRev(); // use it
   System.out.println("Reversed: " + output);
  } // end while
 } // end main()

 // --------------------------------------------------------------

 public static String getString() throws IOException {
  InputStreamReader isr = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(isr);
  String s = br.readLine();
  return s;
 }
 // --------------------------------------------------------------
} // end class ReverseApp
// //////////////////////////////////////////////////////////////

 

 

上面的这个例子就是栈的应用,给定一个字符串按照倒排的顺序重新输出。

栈的效率
在实现栈的类中,数据项入栈和出栈的时间复杂度都为常数O(1).这也就是说,栈操作所耗的时间不依

赖于栈中数据项的个数,因此操作时间短。栈不需要比较和移动操作。


队列

队列(queue),队列是一种数据结构,有点类似栈,只是在队列中第一个插入的数据项也会最先被移出

(先进先出,FIFO),而在栈中,最后插入的数据项最先移出(LIFO)

队列的代码:

package queue;
/**
 * 
 * @author jason
 *
 */
class Queue
{
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
//--------------------------------------------------------------
public Queue(int s)          // constructor
   {
   maxSize = s;
   queArray = new long[maxSize];
   front = 0;
   rear = -1;
   nItems = 0;
   }
//--------------------------------------------------------------
public void insert(long j)   // put item at rear of queue
   {
   if(rear == maxSize-1)         // deal with wraparound
      rear = -1;
   queArray[++rear] = j;         // increment rear and insert
   nItems++;                     // one more item
   }
//--------------------------------------------------------------
public long remove()         // take item from front of queue
   {
   long temp = queArray[front++]; // get value and incr front
   if(front == maxSize)           // deal with wraparound
      front = 0;
   nItems--;                      // one less item
   return temp;
   }
//--------------------------------------------------------------
public long peekFront()      // peek at front of queue
   {
   return queArray[front];
   }
//--------------------------------------------------------------
public boolean isEmpty()    // true if queue is empty
   {
   return (nItems==0);
   }
//--------------------------------------------------------------
public boolean isFull()     // true if queue is full
   {
   return (nItems==maxSize);
   }
//--------------------------------------------------------------
public int size()           // number of items in queue
   {
   return nItems;
   }
//--------------------------------------------------------------
}  // end class Queue
////////////////////////////////////////////////////////////////
class QueueApp
{
public static void main(String[] args)
   {
   Queue theQueue = new Queue(5);  // queue holds 5 items

   theQueue.insert(10);            // insert 4 items
   theQueue.insert(20);
   theQueue.insert(30);
   theQueue.insert(40);

   theQueue.remove();              // remove 3 items
   theQueue.remove();              //    (10, 20, 30)
   theQueue.remove();

   theQueue.insert(50);            // insert 4 more items
   theQueue.insert(60);            //    (wraps around)
   theQueue.insert(70);
   theQueue.insert(80);

   while( !theQueue.isEmpty() )    // remove and display
      {                            //    all items
      long n = theQueue.remove();  // (40, 50, 60, 70, 80)
      System.out.print(n);
      System.out.print(" ");
      }
   System.out.println("");
   }  // end main()
}  // end class QueueApp
////////////////////////////////////////////////////////////////

 


队列的效率
和栈一样,队列中插入数据项和移出数据项的时间复杂度均为 O(1).

双端队列
双端队列就是一个两端都是结尾的对列。队列的每一个端都可以插入数据项和移出数据项。这些方法可

以叫作insertLeft()和insertRight(),以及removeLeft()和removeRight().
如果严禁调用insertLeft()和removeLeft()方法(或禁用右端的操作),双端队列功能就和栈一样。禁

止调用insertLeft()和removeLeft()方法(或相反的另一对方法),他的功能就和队列一样了。
双端队列与栈或队列相比,是一种多用途的数据结构,在容器类库中有时会用双端队列来提供栈和队列

的两种功能。但是,双端队列 不像栈和队列那常用。

优先级队列
优先级队列是比栈和队列更专用的数据结构。但它在很多情况下都很有用。像普通队列一样,优先级队

列有一个对头和一个队尾,并且也是从对头移出数据项。不过在优先级队列中,数据项按关键字的值有

序,这样关键字最小的数据项(或者在某些实现中是关键最大的数据项)总是在队列头。数据项插入的

时候会按照顺序插入到合适的位置以确保队列的顺序。

优先级队列的效率
优先级队列插入操作需要时间O(N)的时间,而删除操作则需要O(1)的时间。

分享到:
评论

相关推荐

    python数据结构与算法

    python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法python数据结构与算法...

    数据结构与算法 数据结构与算法课后习题答案

    数据结构与算法是计算机科学的基础,它涉及到如何有效地组织和管理数据,以便进行高效地查找、存储和处理。本资源包含的数据结构与算法课后习题答案,是学习这一领域的重要辅助材料,可以帮助学生深入理解和巩固所学...

    JS数据结构与算法.pdf

    JS 数据结构与算法.pdf 本书主要介绍了 JavaScript 语言的基础知识,包括数据结构和算法。以下是该书的详细知识点: 一、JavaScript 基础知识 * 变量和数据类型 * 运算符和控制结构 * 函数和对象 * 数组和字符串 ...

    数据结构与算法分析--C语言描述_数据结构与算法_

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。C语言因其高效、底层特性,常被用于实现数据结构和算法,使得程序更接近硬件,性能更优。本资源"数据结构与算法分析--C语言描述"是针对数据...

    java数据结构与算法2

    本书是一本有关计算机编程中所应用的数据结构和算法的书。数据结构是指数据在电脑中存储的安排方式,算法是指软件程序用来操作这些结构中的数据的过程。

    PTA-数据结构与算法题目集.zip

    PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...

    ads 高级数据结构与算法 15-16试卷

    ads15-16试卷,浙江大学高级数据结构与算法15-16考试卷,

    数据结构与算法

    数据结构与算法,讲述基本的数据结构和待机估计,还有简单的算法和复杂度计算

    数据结构与算法视频课程(59集)

    资源名称:数据结构与算法视频课程(59集)资源目录:【】mysql视频教程第41讲存储过程【】数据结构与算法_1.10算法的评价【】数据结构与算法_1.1编程的灵魂:数据结构 算法【】数据结构与算法_1.2算法的作用:猜...

    武汉大学 C#数据结构与算法

    《武汉大学 C#数据结构与算法》是一门深入探讨计算机科学基础的课程,主要针对C#编程语言,涵盖了数据结构和算法这两个核心概念。在学习这门课程时,你将有机会掌握C#语言如何用于实现高效的数据管理和计算方法。 1...

    数据结构与算法教程

    数据结构与算法是计算机科学的核心内容,它们在解决实际问题、提高程序效率以及编写高质量软件中扮演着至关重要的角色。数据结构是计算机存储、组织数据的方式,它可以帮助我们在计算机中以更加高效和合适的方式表示...

    数据结构与算法(C#版)

    ### 数据结构与算法(C#版)关键知识点解析 #### 一、引言 《数据结构与算法(C#版)》是一本旨在通过C#语言来介绍数据结构与算法原理的书籍。随着C#语言和.NET Framework的发展,这本书不仅填补了国内以C#语言讲解...

    数据结构与算法分析—c语言描述

    《数据结构与算法分析—C语言描述》是一本深度探讨数据结构和算法的书籍,它以C语言作为实现工具,为读者提供了丰富的编程实践指导。这本书涵盖了数据结构的基础理论、设计方法以及C语言的实现技巧,是计算机科学...

    数据结构与算法.pdf

    数据结构与算法.pdf 数据结构是计算机科学中的一门重要课程,涉及到数据的逻辑结构、存储结构、算法等方面的知识。在本文件中,我们将详细介绍数据结构的基本概念、逻辑结构、存储结构、抽象数据类型、算法等知识点...

    java数据结构与算法.pdf

    在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...

    数据结构与算法(C#)

    数据结构与算法(C#).PDF及代码 第1章 Collections类、泛型类和Timing类概述 第2章 数组和ArrayList 第3章 基础排序算法 第4章 基础查找算法 第5章 栈和队列 第6章 BitArray类 第7章 字符串、String类和StringBuioder...

    数据结构与算法-PPT课件

    数据结构与算法是计算机科学中的核心课程,它探讨如何有效地组织和处理数据,以及如何设计和分析解决问题的算法。这份“数据结构与算法-PPT课件”提供了丰富的学习材料,涵盖了多个关键主题。 首先,我们要了解数据...

    Java数据结构与算法第二版源代码

    《Java数据结构与算法第二版源代码》是一个深入学习Java编程和算法的重要资源,它包含了丰富的实例和程序,旨在帮助开发者提升对数据结构和算法的理解与应用能力。在这个压缩包中,有两个主要的子文件:...

    Python数据结构与算法分析(第2版)1

    【Python数据结构与算法分析(第2版)】是一本专为Python程序员设计的书籍,旨在帮助读者深入了解数据结构和算法在Python环境中的应用。作者布拉德利·米勒和戴维·拉努姆以其丰富的实战经验,清晰地阐述了如何高效...

Global site tag (gtag.js) - Google Analytics