在各种应试中经常问到的一个问题,请将字符串反转
八戒:这还不简单,利用StringBuffer/StringBuilder的reverse()函数,1秒钟搞定
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.reverse());
问题是题目往往明确要求不使用这些类,出题人期望的是考察应试者的数据结构本领
八戒:恩,那就用for循环取xxx.charAt(i)好了
GOOD JOB!原理是这样的没错
但我们可以通过模拟栈的数据结构,使得自己看似更专业些(主因),同时对栈有一个更好的认识(辅因)
度娘百科:栈,是硬件。主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈其实是一种硬件,所以我们只是模拟其数据操作的结构。
例如计算机是如何识别1+2操作的?我们都知道后缀表达式为12+,计算机无外乎将1入栈,将2入栈,发现+号,依次出栈tmp2=2,tmp1=1,进行tmp1+tmp2
Java提供了我们一个Stack类,现在我们就用其来实现一下逆序
package com.cn;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class TestReverseByStack {
public static String readInput() throws IOException{
InputStreamReader read = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(read);
return buffer.readLine();
}
public static void main(String[] args) throws IOException{
System.out.println("plz input a string:");
String str = readInput();
String result = "";
Stack s = new Stack();
for(int i=0;i<str.length();i++){
s.push(str.charAt(i));
}
for(int i=0;i<str.length();i++){
result += s.pop();
}
System.out.println("after reversing:"+result);
}
}
我们简单的瞅瞅java.util.Stack类的源代码
public class Stack<E> extends Vector<E> {
public Stack() {
}
public E push(E item) {
addElement(item);
return item;
}
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() {
return size() == 0;
}
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
Stack类是Vector的子类,实际上是使用Object数组来模拟一个栈的过程
Stack类又提供了同步的push pop peek等方法来达到模拟先进后出的结构