Java stack 怎么wow继续往下下找?

JAVA Stack详细介绍和示例学习
字体:[ ] 类型:转载 时间:
JAVA Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。
第1部分 Stack介绍Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!Stack的继承关系Stack和Collection的关系如下图:Stack的构造函数Stack只有一个默认构造函数,如下: 代码如下:Stack()&Stack的API 代码如下:Stack是栈,它常用的API如下:&&&&&&&&&&&& boolean&&&&&& empty()synchronized E&&&&&&&&&&&& peek()synchronized E&&&&&&&&&&&& pop()&&&&&&&&&&&& E&&&&&&&&&&&& push(E object)synchronized int&&&&&&&&&& search(Object o)由于Stack和继承于Vector,因此它也包含Vector中的全部API。&第2部分 Stack源码解析Stack的源码非常简单,下面我们对它进行学习。 代码如下:package java.publicclass Stack&E& extends Vector&E& {&&& // 版本ID。这个用于版本升级控制,这里不须理会!&&& private static final long serialVersionUID = 1339165L;&&& // 构造函数&&& public Stack() {&&& }&&& // push函数:将元素存入栈顶&&& public E push(E item) {&&&&&&& // 将元素存入栈顶。&&&&&&& // addElement()的实现在Vector.java中&&&&&&& addElement(item);&&&&&&&&&& }&&& // pop函数:返回栈顶元素,并将其从栈中删除&&& public synchronized E pop() {&&&&&&& E&&&&&&&&&& int&&& len = size();&&&&&&& obj = peek();&&&&&&& // 删除栈顶元素,removeElementAt()的实现在Vector.java中&&&&&&& removeElementAt(len - 1);&&&&&&&&&& }&&& // peek函数:返回栈顶元素,不执行删除操作&&& public synchronized E peek() {&&&&&&& int&&& len = size();&&&&&&& if (len == 0)&&&&&&&&&&& throw new EmptyStackException();&&&&&&& // 返回栈顶元素,elementAt()具体实现在Vector.java中&&&&&&& return elementAt(len - 1);&&& }&&& // 栈是否为空&&& public boolean empty() {&&&&&&& return size() == 0;&&& }&&& // 查找“元素o”在栈中的位置:由栈底向栈顶方向数&&& public synchronized int search(Object o) {&&&&&&& // 获取元素索引,elementAt()具体实现在Vector.java中&&&&&&& int i = lastIndexOf(o);&&&&&&& if (i &= 0) {&&&&&&&&&&& return size() -&&&&&&& }&&&&&&& return -1;&&& }}总结:(01) Stack实际上也是通过数组去实现的。&&&&&& 执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。&&&&&& 执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。&&&&&& 执行pull时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。(02) Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。第3部分 Vector示例下面我们通过实例学习如何使用Stack 代码如下:import java.util.Simport java.util.Iimport java.util.L/**&* @desc Stack的测试程序。测试常用API的用法&*&* @author skywang&*/public class StackTest {&&& public static void main(String[] args) {&&&&&&& Stack stack = new Stack();&&&&&&& // 将1,2,3,4,5添加到栈中&&&&&&& for(int i=1; i&6; i++) {&&&&&&&&&&& stack.push(String.valueOf(i));&&&&&&& }&&&&&&& // 遍历并打印出该栈&&&&&&& iteratorThroughRandomAccess(stack) ;&&&&&&& // 查找“2”在栈中的位置,并输出&&&&&&& int pos = stack.search("2");&&&&&&& System.out.println("the postion of 2 is:"+pos);&&&&&&& // pup栈顶元素之后,遍历栈&&&&&&& stack.pop();&&&&&&& iteratorThroughRandomAccess(stack) ;&&&&&&& // peek栈顶元素之后,遍历栈&&&&&&& String val = (String)stack.peek();&&&&&&& System.out.println("peek:"+val);&&&&&&& iteratorThroughRandomAccess(stack) ;&&&&&&& // 通过Iterator去遍历Stack&&&&&&& iteratorThroughIterator(stack) ;&&& }&&& /**&&&& * 通过快速访问遍历Stack&&&& */&&& public static void iteratorThroughRandomAccess(List list) {&&&&&&& String val =&&&&&&& for (int i=0; i&list.size(); i++) {&&&&&&&&&&& val = (String)list.get(i);&&&&&&&&&&& System.out.print(val+" ");&&&&&&& }&&&&&&& System.out.println();&&& }&&& /**&&&& * 通过迭代器遍历Stack&&&& */&&& public static void iteratorThroughIterator(List list) {&&&&&&& String val =&&&&&&& for(Iterator iter = list.iterator(); iter.hasNext(); ) {&&&&&&&&&&& val = (String)iter.next();&&&&&&&&&&& System.out.print(val+" ");&&&&&&& }&&&&&&& System.out.println();&&& }}
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具为什么质疑Java中的Stack
来源:博客园
问题由来
曾经遇到过一条面试题,“Java中的Stack是通过Vector来实现的,这种设计被认为是不良的设计,说说你的看法?”
解析Java中的Stack
众所周知Stack(栈)是一种先进后出的数据结构。当中有两个重要的方法:push(进栈)和pop(出栈)。

几乎所有语言在实现栈时,都会实现这两个方法,进栈和出栈。而栈这种数据结构在多数时候用来插入和删除元素(进栈则是在顶部插入元素,出栈则是从顶部删除元素),较少情况会用来查找元素。所以从实现方式上,大多是以链表方式实现而非数值方式实现(在插入删除方法上,链表效率优于数组效率)。
反观Java中的Stack,查看源代码:

public class Stack&E& extends Vector&E& {
* Creates an empty Stack.
public Stack() {
* Pushes an item onto the top of this stack. This has exactly
* the same effect as:
* &blockquote&&pre&
* addElement(item)&/pre&&/blockquote&
the item to be pushed onto this stack.
the &code&item&/code& argument.
java.util.Vector#addElement
public E push(E item) {
addElement(item);
return
* Removes the object at the top of this stack and returns that
* object as the value of this function.
The object at the top of this stack (the last item
of the &tt&Vector&/tt& object).
* @exception
EmptyStackException
if this stack is empty.
public synchronized E pop() {
len = size();
obj = peek();
removeElementAt(len - 1);
return
* Looks at the object at the top of this stack without removing it
* from the stack.
the object at the top of this stack (the last item
of the &tt&Vector&/tt& object).
* @exception
EmptyStackException
if this stack is empty.
public synchronized E peek() {
len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
* Tests if this stack is empty.
&code&true&/code& if and only if this stack contains
* &code&false&/code& otherwise.
public boolean empty() {
return size() == 0;
* Returns the 1-based position where an object is on this stack.
* If the object &tt&o&/tt& occurs as an item in this stack, this
* method returns the distance from the top of the stack of the
* occurrence nearest
the topmost item on the
* stack is considered to be at distance &tt&1&/tt&. The &tt&equals&/tt&
* method is used to compare &tt&o&/tt& to the
* items in this stack.
the desired object.
the 1-based position from the top of the stack where
t the return value &code&-1&/code&
indicates that the object is not on the stack.
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i &= 0) {
return size() -
return -1;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1339165L;

可以看到Stack继承Vector,而Vector是由数组实现的集合类,他包含了大量集合处理的方法。而Stack之所以继承Vector,是为了复用Vector中的方法,来实现进栈(push)、出栈(pop)等操作。
这里就是质疑Stack的地方,既然只是为了实现栈,为什么不用链表来单独实现,只是为了复用简单的方法而迫使它继承Vector(Stack和Vector本来是毫无关系的)。这使得Stack在基于数组实现上效率受影响,另外因为继承Vector类,Stack可以复用Vector大量方法,这使得Stack在设计上不严谨,当我们看到Vector中的:

public void add(int index, E element) {
insertElementAt(element, index);
}

可以在指定位置添加元素,这与Stack 的设计理念相冲突(栈只能在栈顶添加或删除元素)。
所以Java中的Stack实现确实值得商榷。
使用链表模拟Stack
一个单纯的栈,其实可以只包含以下方法:
boolean empty() 测试堆栈是否为空。
T peek() 

查看堆栈顶部的对象,但不从堆栈中移除它。
T pop() 

移除堆栈顶部的对象,并作为此函数的值返回该对象。
void push(T item) 

把项压入堆栈顶部。
我们使用链表来模拟一个栈:

public class Stack&T& {
private Node&T&
* 返回栈顶元素
* @return
public T peek() {
return top.getData();
* 从栈中弹出项
* @return
public T pop() {
T data = null;
if (top != null) {
data = top.getData();
top = top.getNextNode();
return
* 向栈内压入项
* @param data
public void push(T data) {
Node&T& node = new Node&T&();
node.setData(data);
if (top == null) {
top =
} else {
node.setNextNode(top);
top.setPreNode(node);
top =
* 是否是空栈
* @return
public boolean isEmpty() {
return top == null;
}


public class Node&T& {
private T
// 前驱节点
private Node&T& preN
// 后继节点
private Node&T& nextN
public T getData() {
return
public void setData(T data) {
this.data =
public Node&T& getPreNode() {
return preN
public void setPreNode(Node&T& preNode) {
this.preNode = preN
public Node&T& getNextNode() {
return nextN
public void setNextNode(Node&T& nextNode) {
this.nextNode = nextN
}

编写一个main测试:

* @param args
public static void main(String[] args) {
Stack&Integer& stack = new Stack&Integer&();
stack.push(1);
stack.push(2);
System.out.println(stack.peek());
stack.push(3);
stack.push(4);
System.out.println(stack.peek());
stack.push(5);
stack.push(6);
System.out.println(stack.pop());
System.out.println(stack.peek());
}

免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动java中e.printStackTrace()方法的输出位置问题?_词汇网
java中e.printStackTrace()方法的输出位置问题?
责任编辑:词汇网 发表时间: 23:41:25
这是我们教材上面一段代码,我照着打了一遍想要看下结果,发现e.printStackTrace()方法输出的结果每次在运行时出现的位置都不同。如图很明显,这个方法输出的应该是这么一段语句:java.lang.ArrayIndexOutOfBoundsException: 3 at ExceptionDemo2.main(ExceptionDemo2.java:13)根据我代码的顺序,这段语句的输出位置应该是在“3”和“有异常出现!”之间。 但是实际上它有时出现在正确位置,有时出现在最后面,有时甚至拆开了一半在上一半在下,每次运行结果都不同,想知道这是什么原因,为什么会出现?这是我们教材上面一段代码,我照着打了一遍想要看下结果,发现e.printStackTrace()方法输出的结果每次在运行时出现的位置都不同。如图…显示全部
上一集:没有了 下一集:
相关文章:&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索

我要回帖

更多关于 oneinstack 的文章

 

随机推荐