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

 更新时间:2017年06月02日 11:08:29   作者:想作会飞的鱼  
这篇文章主要介绍了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 
//////////////////////////////////////////////////////////////// 

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

相关文章

  • 详解MyBatis多数据源配置(读写分离)

    详解MyBatis多数据源配置(读写分离)

    这篇文章主要介绍了详解MyBatis多数据源配置(读写分离),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • MyBatis中的N+1问题的解决方法

    MyBatis中的N+1问题的解决方法

    本文主要介绍了MyBatis中的N+1问题的四种解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Java实现AC自动机全文检索示例

    Java实现AC自动机全文检索示例

    本篇文章主要介绍了Java实现AC自动机全文检索示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java中JWT的使用的详细教程

    Java中JWT的使用的详细教程

    JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输,本文介绍了Java中JWT的使用,需要的朋友可以参考下
    2023-02-02
  • 快速上手Mybatis-plus结构构建过程

    快速上手Mybatis-plus结构构建过程

    这篇文章主要介绍了快速上手Mybatis-plus结构构建过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java大话之创建型设计模式教程示例

    java大话之创建型设计模式教程示例

    这篇文章主要为大家介绍了java大话之创建型设计模式教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • springboot项目获取resources相对路径的方法

    springboot项目获取resources相对路径的方法

    这篇文章主要介绍了springboot项目获取resources相对路径的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Hibernate使用hbm.xml配置映射关系解析

    Hibernate使用hbm.xml配置映射关系解析

    这篇文章主要介绍了Hibernate使用hbm.xml配置映射关系解析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 示例解析java面向对象编程封装与访问控制

    示例解析java面向对象编程封装与访问控制

    这篇文章主要为大家介绍了java封装与访问控制的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java使用POI实现导出Excel的方法详解

    Java使用POI实现导出Excel的方法详解

    在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。本文将利用POI实现导出Excel,需要的可以参考一下
    2022-10-10

最新评论