java 数据结构中栈结构应用的两个实例

java 数据结构中栈结构应用的两个实例

1、单词逆序。

要求从控制台读入一串字符,按回车结束输入,同时显示其逆序字符串。

对于颠倒顺序的操作,用栈来解决是很方便的。具体思想是把字符串中的每一个字符按顺序存入栈中,然后再一个一个的从栈中取出。这时就是按照逆序取出的字符串。

// reverse.java
// stack used to reverse a string
// to run this program: C>java ReverseApp
import java.io.*;         // for I/O
////////////////////////////////////////////////////////////////
class StackX//定义了栈的基本结构和操作
  {
  private int maxSize;//栈最大值
  private char[] stackArray;//栈内用数组存储数据
  private int top;//当前栈顶标号,从0开始
//--------------------------------------------------------------
  public StackX(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
   StackX theStack = new StackX(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("") )    // 若没有输入字符串直接按回车,则结束
      break;
                    // make a Reverser
     Reverser theReverser = new Reverser(input);
     output = theReverser.doRev(); // use it
     System.out.println("Reversed: " + output);
     } // end while
     System.out.println("this is end");
   } // 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
////////////////////////////////////////////////////////////////

2.分隔符匹配

有些分割符在编程中一定是成对出现的,例如(),{},和[]等。如果发现有未匹配的分隔符,编译器会报错。因为匹配操作采取就近原则,后输入的分割符优先匹配,具有“后进先出”的特点。这个匹配操作可以用栈来实现。

具体操作是在输入过程中,如果遇到左匹配符,则将左匹配符压入栈中。如果遇到右匹配符,则从栈中取出一个数据,分析其与右匹配符是否相匹配。若匹配,则继续进行,若不匹配,则报错终止。

// brackets.java
// stacks used to check matching brackets
// to run this program: C>java bracketsApp
import java.io.*;         // for I/O
////////////////////////////////////////////////////////////////
class StackX
  {
  private int maxSize;
  private char[] stackArray;
  private int top;
//--------------------------------------------------------------
  public StackX(int s)    // constructor
   {
   maxSize = s;
   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 BracketChecker
  {
  private String input;          // input string
//--------------------------------------------------------------
  public BracketChecker(String in)    // constructor
   { input = in; }
//--------------------------------------------------------------
  public void check()
   {
   int stackSize = input.length();   // get max stack size
   StackX theStack = new StackX(stackSize); // make stack 

   for(int j=0; j<input.length(); j++) // get chars in turn
     {
     char ch = input.charAt(j);    // get char
     switch(ch)
      {
      case '{':           // opening symbols
      case '[':
      case '(':
        theStack.push(ch);     // push them
        break; 

      case '}':           // closing symbols
      case ']':
      case ')':
        if( !theStack.isEmpty() )  // if 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:  // no action on other characters
        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
   {
   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;
                 // make a BracketChecker
     BracketChecker theChecker = new BracketChecker(input);
     theChecker.check();   // check brackets
     } // 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 BracketsApp
////////////////////////////////////////////////////////////////

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java数据结构之栈的基本定义与实现方法示例

    本文实例讲述了Java数据结构之栈的基本定义与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.基本概念: 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来). 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶 浮动:栈中元素个数为零时称为空栈.插入一般

  • Java数据结构与算法之栈(动力节点Java学院整理)

    stack,中文翻译为堆栈,其实指的是栈,heap,堆.这里讲的是数据结构的栈,不是内存分配里面的堆和栈. 栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的. 队列就是排队买苹果,先去的那个可以先买. 栈 public class Stack { private int array[]; private int max; private int top; public Stack(int max){ this.max = max; array = new int[m

  • 用Java代码实现栈数据结构的基本方法归纳

    链式实现: 在栈的一段添加和删除元素,在栈中维护一个指向栈顶的结点和一个count变量指示栈的大小: private LinearNode top; //指向栈顶 private int count;//标记栈的大小 每次出栈和压栈在链表的表头:(也可以再表尾,实现方式不一样而已) top--->元素1--->元素2--->元素3......... 实现(附带测试main): LinkedStack package Stack; import Bag.LinearNode; //为了重点

  • Java模拟栈和队列数据结构的基本示例讲解

    栈和队列: 一般是作为程序员的工具,用于辅助构思算法,生命周期较短,运行时才被创建: 访问受限,在特定时刻,只有一个数据可被读取或删除: 是一种抽象的结构,内部的实现机制,对用户不可见,比如用数组.链表来实现栈. 模拟栈结构 同时,只允许一个数据被访问,后进先出 对于入栈和出栈的时间复杂度都为O(1),即不依赖栈内数据项的个数,操作比较快 例,使用数组作为栈的存储结构 public class StackS<T> { private int max; private T[] ary; priv

  • Java数据结构之队列的简单定义与使用方法

    本文实例讲述了Java数据结构之队列的简单定义与使用方法.分享给大家供大家参考,具体如下: 一.概述: 1.说明: 队列的原则时先进先出,就像生活中排队取票一样,谁排在前面谁先得到 2.有五个属性: 1)数组元素 2)最大空间 3)长度 4)队头 5)队尾 3.示例图: 二.代码实现 /** * @描述 对列 * @项目名称 Java_DataStruct * @包名 com.java.stack * @类名 Queue * @author chenlin * @version 1.0 * @S

  • java数据结构之java实现栈

    复制代码 代码如下: import java.util.Arrays; /** * 栈的实现<br> * @author Skip * @version 1.0 */public class Stack<T> { private int size;    //栈中元素的个数 private Object[] arr;  //底层数组 private final int defaultLength = 200; //默认长度 /**  * 无参构造,使用默认长度初始化数组  */ p

  • Java中使用数组实现栈数据结构实例

    栈是Java语言中最重要的数据结构之一,它的实现,至少应该包括以下几个方法: 1.pop() 出栈操作,弹出栈顶元素. 2.push(E e) 入栈操作 3.peek() 查看栈顶元素 4.isEmpty() 栈是否为空 另外,实现一个栈,还应该考虑到几个问题: 1.栈的初始大小以及栈满以后如何新增栈空间 2.对栈进行更新时需要进行同步 简单示例,使用数组实现栈,代码如下: 复制代码 代码如下: public class Stack<E> { // Java 不支持泛型数组,如需使用,请使用J

  • java 数据结构之栈与队列

    java 数据结构之栈与队列 一:对列 队列是一种先进先出的数据结构 实现代码: package Queue; /* * 使用java构建队列,并模拟实现队列的入队和出对方法 */ public class Queue { //队列类 private int maxSize; //定义队列的长度 private int[] arrQueue; //队列 private int rear; //定义队列的尾指针 private int front; //定义队列的头指针 private int e

  • java 数据结构中栈和队列的实例详解

    java 数据结构中栈和队列的实例详解 栈和队列是两种重要的线性数据结构,都是在一个特定的范围的存储单元中的存储数据.与线性表相比,它们的插入和删除操作收到更多的约束和限定,又被称为限定性的线性表结构.栈是先进后出FILO,队列是先进先出FIFO,但是有的数据结构按照一定的条件排队数据的队列,这时候的队列属于特殊队列,不一定按照上面的原则. 实现栈:采用数组和链表两种方法来实现栈 链表方法: package com.cl.content01; /* * 使用链表来实现栈 */ public cl

  • Java数据结构与算法之栈(Stack)实现详解

    本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型顺序栈的设计与实现链式栈的设计与实现栈的应用 栈的抽象数据类型   栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作

随机推荐