浅入浅出Java数据结构-栈(下)
浅入浅出Java数据结构--栈(上)
在各种应试中经常问到的一个问题,请将字符串反转
八戒:这还不简单,利用StringBuffer/StringBuilder的reverse()函数,1秒钟搞定
问题是题目往往明确要求不使用这些类,出题人期望的是考察应试者的数据结构本领
八戒:恩,那就用for循环取xxx.charAt(i)好了
GOOD JOB!原理是这样的没错
但我们可以通过模拟栈的数据结构,使得自己看似更专业些(主因),同时对栈有一个更好的认识(辅因)
度娘百科:栈,是硬件。主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈其实是一种硬件,所以我们只是模拟其数据操作的结构。
例如计算机是如何识别1+2操作的?我们都知道后缀表达式为12+,计算机无外乎将1入栈,将2入栈,发现+号,依次出栈tmp2=2,tmp1=1,进行tmp1+tmp2
Java提供了我们一个Stack类,现在我们就用其来实现一下逆序
我们简单的瞅瞅java.util.Stack类的源代码
Stack类是Vector的子类,实际上是使用Object数组来模拟一个栈的过程
Stack类又提供了同步的push pop peek等方法来达到模拟先进后出的结构
在各种应试中经常问到的一个问题,请将字符串反转
八戒:这还不简单,利用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等方法来达到模拟先进后出的结构