前面的文章我们讲了JAVA深入学习(栈和队列)之栈 ,并且用数组实现了栈的先进后出。现在我们做一个栈的示例应用-单词逆序。
题目
栈的第一个例子是做一件非常简单的事情:单词逆序。运行程序时,提示输入一个单词,回车键【Enter】后,便会显示字幕顺序倒置后的词。
![57f679f97b039abf2e12aadf59842376.png](https://img-blog.csdnimg.cn/img_convert/57f679f97b039abf2e12aadf59842376.png)
用栈进行单词逆序:首先,字幕从输入的字符串中一个接一个地读取出来并压入栈中。接着它们依次弹出栈,并显示出来。因为栈的先进后出的特性,所以字母的顺序就颠倒过来了。
代码
栈代码:
/** * Created by Bruce on 2020/8/17 **/public class StackOfChar_02 { private int maxSize; private char[] stackArray; private int top; public StackOfChar_02(int maxSize) { this.maxSize = maxSize; stackArray = new char[maxSize]; top = -1; } /** * 是否为空 * @return */ public boolean isEmpty(){ return top == -1;//栈顶指针为默认值-1,则代表为空 } /** * 栈是否已满 * @return */ public boolean isFull(){ return top == maxSize - 1;//栈顶指针为限制数量-1 } /** * 向栈中压入元素 * @param value * @return */ public boolean push(char value){ if (isFull()){//已满压入失败// return false;//实际使用中-可抛出异常处理 throw new RuntimeException("stack is full"); } stackArray[++top] = value;//栈顶压入-top是在插入数据项之前递增的 return true; } /** * 弹栈 * @return */ public char pop(){ if(isEmpty()){//栈为空// return -1;//实际使用中-可抛出异常处理 throw new RuntimeException("stack is empty"); } return stackArray[top--];//先返回再递减 } /** * 查看栈顶元素 * @return */ public char peek(){ if(isEmpty()){//栈为空返回-1;// return -1L;//实际使用中-可抛出异常处理 throw new RuntimeException("stack is empty"); } return stackArray[top]; }}
逆序操作代码:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * Created by Bruce on 2020/8/17 **/public class Reverser { private String inputStr; private String outputStr; public Reverser(String inputStr) { this.inputStr = inputStr; } public String doRev(){ if(inputStr == null || inputStr.length() <= 0){ return null; } int length = inputStr.length();//获取输入字符串长度 StackOfChar_02 stack = new StackOfChar_02(length);//按照字符串长度初始化栈空间大小 for(int i = 0; i < length; i++){ stack.push(inputStr.charAt(i));//入栈 } outputStr = ""; while (!stack.isEmpty()){//栈不为空时候,循环弹栈 outputStr = outputStr + stack.pop(); } return outputStr; } /** * 获取键盘输入流 * @return * @throws IOException */ public static String getSystemInputString() throws IOException { InputStreamReader in = new InputStreamReader(System.in); BufferedReader bufferedReader = new BufferedReader(in); return bufferedReader.readLine();//只获取一行输入// String finalStr = "";// String temp;// while ((temp = bufferedReader.readLine()) != null){// finalStr = finalStr + temp;// }// return finalStr; } public static void main(String[] args) throws IOException { String input,output; while (true){ System.out.println("Enter a String:"); System.out.flush(); input = getSystemInputString(); System.out.println("inputStr:" + input); if(input == null || input.length() <= 0 || input.trim().equals("")){//输入数据不能为空,为空则中断 break; } Reverser reverser = new Reverser(input); output = reverser.doRev(); System.out.println("Reverser outputStr:" + output); } }}
示例输出:
Enter a String:
bruce
inputStr:bruce
Reverser outputStr:ecurb
Enter a String:
bruce and tom
inputStr:bruce and tom
Reverser outputStr: mot dna ecurb
Enter a String:
inputStr:
Process finished with exit code 0
代码解析
建立Reverse类来处理输入字符串的逆序工作。该类的关键组成部分是“doRev()”方法,该方法利用栈实现逆置操作。在“doRev()”方法中创建了一个栈,它根据输入字符串的长度确定栈的大小。
“main()”方法中由用户输入一个字符串,创建Reverser对象,字符串作为参数传给构造方法,接着调用这个对象的“doRev()”方法,并显示返回值,这个返回值是逆序的字符串。