`
zhaohaolin
  • 浏览: 1004174 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

栈和队列

阅读更多

栈和队列不适合作为数据的记录工具,它们更多地是作为程序员的工具来运用。主要作 为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比数组、链表等数据库类型的结构要短的多。在程序操作执行期间他们才被创建,通 常用它们去执行某项特殊的任务;当完成任务后,它们就被销毁。
       下面的StackX类,实现一个栈的功能:

class StackX
{
    
private int maxSize;
    
private char[] stackArray;
    
private int top;

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


    
public void push(char j)    //入栈,注意要先将top指针上移,然后将数据赋给新的top位置
    {
        stackArray[
++top] = j;
    }


    
public char pop()    //出栈,先取得数据,然后将top下移
    {
        
return stackArray[top--];
    }


    
public char peek()    //只查看栈顶的元素,top指针不动
    {
        
return stackArray[top];
    }


    
public boolean isEmpty()
    
{
        
return (top == -1);
    }

}
//end class StackX

 

对这个类的解释:

StackX是构造方法,根据参数规定的容量创建一个新栈。栈的域包括表示最大容量的变量、数组本身以及变量top,它存储栈顶元素的下标。

Push方法中将top值增加一,使它指向原顶端数据项的上面的一个位置,并在在这个位置上存储一个数据项,再次提醒,top是在插入数据项之前递增的。

Pop方法返回top标识的数据项值,然后top减一。这个方法有效地从栈中移除了数据项;虽然数据项仍然存在数组中,直到有新的数据项压入栈中覆盖这个数据项。但是它不能再被访问了。

Peek方法仅返回top所指的数据项的值,不对栈做任何改动。

IsEmpty方法在栈空时返回true,栈空时top值为-1

一种典型的应用是栈用于解析某种类型的文本串。 通常,文本串是计算机语言写的代码行,而解析它们的程序就是编译器。一个典型的例子是分隔符匹配程序,它从字符串中不断读取字符,每次读取一个字符。若发 现它是一个左分隔符,将它压入栈中。当从输入中读到一个右分隔符时,弹出栈顶的左分隔符,并且查看它是否合右分隔符相匹配。如果它们不匹配,则程序报错。 如果栈中没有左分隔符和右分隔符匹配,或者一直存在着没有被匹配的分隔符,程序也报错。这个方法的可行性在于,最后出现的左边分隔符需要最先匹配,这个规 律符合栈的后进先出的特点。
下面是分隔符匹配程序的代码:
import java.io.*;

class StackX{} 这个类的定义前面已经给出
class BracketChecker
{
    
private String input;

    
public BracketChecker(String in)
    
{
        input
=in;
    }


    
public void check()
    
{
        
int stackSize = input.length();
        StackX theStack 
= new StackX(stackSize);

        
for(int j=0;j<input.length();j++)//get chars in turn
        {
            
char ch = input.charAt(j);
            
switch(ch)
            
{
                
case '{':    //opening symbols
                case '[':
                
case '(':
                    theStack.push(ch);    
//push them
                    break;
                
                
case '}':    //closing symbols
                case ']':
                
case ')':
                    
if(!theStack.isEmpty())    //stack not empty
                    {
                        
char chx=theStack.pop();    //pop and check
                        if((ch=='}' && chx!='{')||(ch==']' && chx!='[')||(ch==')' && chx!='('))
                            System.out.println(
"ERROR: "+ch+" at "+j);
                    }

                    
else    //prematurely empty
                        System.out.println("Error:"+ch+" at "+j);
                    
break;
                
default:
                    
break;
            }
//end switch
        }
//end for
        
//at this point, all characters have been processed
        if(!theStack.isEmpty())
            System.out.println(
"Error: missing right delimiter");
    }
//end check
}
//end class Bracketchecker
//////////////////////////////////////////////////////

class  BracketsApp
{
    
public static void main(String[] args) throws IOException
    
{
        
//System.out.println("Hello World!");
        String input;
        
while(true)
        
{
            System.out.print(
"Enter string containing delimiters:");
            System.out.flush();
            input 
= getString();//read a string from kbd
            if(input.equals(""))//quit if [Enter]
                break;

            BracketChecker theChecker 
= new BracketChecker(input);
            theChecker.check();
        }

    }
//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 BracketsApp

下面是一个队列的实现代码:

class Queue
{
    
private int maxSize;
    
private long[] queArray;
    
private int front;
    
private int rear;
    
private int nItems;
    
    
public Queue(int s)
    
{
        maxSize 
= s;
        queArray 
= new long[maxSize];
        front 
= 0;
        rear 
= -1;
        nItems 
= 0;
    }


    
public void insert(long j) throws Exception    //put item at rear of queue
    {
        
if(this.isFull())    //throw Exception if queue is full
            throw new Exception("Can't insert because queue is Full");
        
if(rear == maxSize-1)    //deal with wraparound
            rear = -1;
        queArray[
++color: #000000; padding: 0px; margin: 0
分享到:
评论

相关推荐

    栈和队列的基本操作

    "栈和队列的基本操作" 栈和队列是计算机科学中两个基本的数据结构,它们的基本操作包括进栈、出栈、进队、出队等。栈是一种后进先出的数据结构,即最后一个入栈的元素将是第一个出栈的元素。队列是一种先进先出的...

    数据结构实验栈和队列详细实验报告

    【栈和队列的基本概念】 栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特点。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是在栈顶添加元素,而出栈则是删除栈顶元素。栈的应用...

    数据结构栈和队列试题及答案

    队列和栈都是运算受限的线性表,只允许在表的一端进行特定的插入和删除操作,该说法正确。 18. **栈和队列的基本属性** 栈和队列都是线性表,但它们分别采用了LIFO和FIFO的规则来约束插入和删除操作,该说法正确...

    栈和队列源代码

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

    数据结构栈和队列(参考代码)

    ### 数据结构栈和队列知识点解析 #### 一、栈的基本概念与操作 **栈**是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端被称为栈底。栈遵循先进后出(First In Last Out, FILO)的...

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

    根据给定的信息,本文将详细解释如何利用栈和队列这两种数据结构来设计一个高效的停车管理系统。我们将重点探讨栈和队列的特点,并说明如何利用这些特点解决停车问题。 ### 栈与队列的基础概念 #### 栈(Stack) ...

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

    本话题聚焦于"回文判断程序",并涉及到"栈"和"队列"这两种基本数据结构的操作。回文是一种正读反读都能读通的字符串,如"level"或"madam"。在判断一个字符串是否为回文时,栈和队列可以发挥重要作用。 首先,我们来...

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

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

    栈和队列(基础知识,单项选择题,填空题,简答题,程序)

    ### 栈和队列基础知识详解 #### 栈与队列的特性及作用 栈和队列作为两种基本的数据结构,在程序设计中扮演着至关重要的角色。**栈**遵循后进先出(Last In First Out,LIFO)的原则,类似于一叠盘子,你只能在最...

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

    ### 数据结构实验报告《二、栈和队列的运用》 #### 栈和队列的基础概念及应用 在计算机科学中,数据结构是用于组织和存储数据的方式,它允许高效地访问和修改数据。其中,栈(Stack)和队列(Queue)是最基本的...

    利用栈和队列实现迷宫

    "利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...

    栈和队列的算法以及应用

    ### 栈和队列的算法以及应用 #### 栈的基本概念与操作 栈是一种线性数据结构,其特点是只能在一端进行插入或删除操作,通常称为栈顶(top)。这种特性使得栈的操作遵循“后进先出”(Last In First Out, LIFO)的原则...

    栈和队列 实验报告

    实验报告——栈和队列 一、实验目的 本次实验的主要目标是深入理解和熟练掌握两种基本数据结构——栈和队列的实现。首先,通过编程实现顺序栈,旨在熟悉栈的“后进先出”(LIFO)特性,以及相关的操作如初始化、...

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

    在这个"数据结构试验2-栈和队列实验报告含源码"中,我们将深入探讨两个基本且至关重要的数据结构——栈和队列。 栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构。想象一个堆叠的盘子,最后一个放...

    栈和队列详解

    "栈和队列详解" 栈和队列是数据结构中两个基本的数据结构概念,本文将详细介绍栈和队列的定义、原理、操作和应用。 栈的定义和原理 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,栈中的元素按照加入...

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    数据结构 栈和队列PPT

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

    数据结构上机实验_栈和队列的应用_迷宫问题 (含代码和报告)

    **实验背景**:本实验旨在加深学生对数据结构中栈和队列的理解,并通过实际编程应用的方式掌握这两种数据结构的特点及其应用场景。栈和队列作为两种基本的数据结构,在算法设计、程序开发等多个领域都有着广泛的应用...

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

    队列常用于模拟现实生活中排队等候的情况,例如任务调度、打印作业队列和缓冲区管理等。队列的基本操作包括初始化队列、销毁队列、清空队列、判断队列是否为空、获取队列长度、入队和出队。 在实际实现中,栈和队列...

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

    通过阅读和分析这段代码,我们可以深入理解如何使用C++的指针和结构体来构建链表节点,以及如何通过指针操作来实现栈的压栈和弹栈、队列的入队和出队操作。 例如,创建链表节点的结构体可能如下: ```cpp struct ...

Global site tag (gtag.js) - Google Analytics