浅入浅出Java数据结构--栈(上)

在各种应试中经常问到的一个问题,请将字符串反转
八戒:这还不简单,利用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等方法来达到模拟先进后出的结构

你可能感兴趣的:(java)