package org.lza;
//import java.util.Stack;
/*
* Given an input string, reverse the string word by word.
* For example,
* Given s = "the sky is blue",
* return "blue is sky the".
*/
/*
* 思路:首先 看到题目中只是单词被反序 单词内部没有反序 想到反序可以用栈来实现
*/
public class ReverseString {
public static void main(String[] args) {
String s = "the sky is blue";
String reversStr = Reverse(s);
System.out.println(reversStr);
}
public static String Reverse(String s) {
// 创建一个空栈
int length = s.length();
Stack stack = new Stack();
char[] str = s.toCharArray();
// char[] strRs=new char[length];
StringBuffer strRs = new StringBuffer();
for (char ch : str) {
stack.push(ch);// 入栈
}
Stack stackTemp = new Stack();
int j = -1;
for (int i = 0; i < length; i++) {
if (stack.isEmpty())
break;
char ch = (char) stack.pop();
if (ch != ' ') { // 将单词字母入栈
stackTemp.push(ch);
if(!stack.isEmpty())
continue;
}
if (!stackTemp.isEmpty()) {// 碰到空字符或者栈底则反转单词
while(!stackTemp.isEmpty())
// strRs[n]=(char)stackTemp.pop();
strRs.append(stackTemp.pop());
j = i;
}
if(ch==' ')
strRs.append(ch);
}
return strRs.toString();
}
}
class Stack {
private final int LEN = 10;// 初始栈大小
private int top;// 栈顶指针
private Object[] elements;// 数据元素数组
public Stack() { // 初始化栈
top = -1;
elements = new Object[LEN];
}
/*
* 函数名:isEmpty()
* @return:栈为空则返回true,否则返回false
*/
public boolean isEmpty() {
return top < 0;
}
/*
* 函数名:public void push(Object e)
* 函数功能:将元素插入栈中
* @param Object e:要进栈的元素
* @return :无
*/
public void push(Object e){
if(elements.length+1>=LEN){
//扩充存储空间
expandStack();
}
elements[++top]=e;
}
private void expandStack(){
Object[] temp=new Object[elements.length*2];
for(int i=0;i<elements.length;i++){
temp[i]=elements[i];
}
elements=temp;
}
public int getSize(){
return top+1;
}
public Object pop(){
if(getSize()<1){
System.out.println("空栈!");
return null;
}
Object e=elements[top];
elements[top--]=null;//释放内存
return e;
}
}