前面的文章我们讲了 ,并且用数组实现了栈的先进后出。现在我们做一个栈的示例应用-单词逆序。
题目
栈的第一个例子是做一件非常简单的事情:单词逆序。运行程序时,提示输入一个单词,回车键【Enter】后,便会显示字幕顺序倒置后的词。
用栈进行单词逆序:首先,字幕从输入的字符串中一个接一个地读取出来并压入栈中。接着它们依次弹出栈,并显示出来。因为栈的先进后出的特性,所以字母的顺序就颠倒过来了。
代码
栈代码:
/**
* 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()”方法,并显示返回值,这个返回值是逆序的字符串。