JAVA Stack详细介绍和示例学习
程序员文章站
2024-02-13 10:35:52
第1部分 stack介绍stack是栈。它的特性是:先进后出(filo, first in last out)。java工具包中的stack是继承于vector(矢量队列)...
第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.util;
public
class stack<e> extends vector<e> {
// 版本id。这个用于版本升级控制,这里不须理会!
private static final long serialversionuid = 1224463164541339165l;
// 构造函数
public stack() {
}
// push函数:将元素存入栈顶
public e push(e item) {
// 将元素存入栈顶。
// addelement()的实现在vector.java中
addelement(item);
return item;
}
// pop函数:返回栈顶元素,并将其从栈中删除
public synchronized e pop() {
e obj;
int len = size();
obj = peek();
// 删除栈顶元素,removeelementat()的实现在vector.java中
removeelementat(len - 1);
return obj;
}
// 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() - i;
}
return -1;
}
}
总结:
(01) stack实际上也是通过数组去实现的。
执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
执行pull时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
(02) stack继承于vector,意味着vector拥有的属性和功能,stack都拥有。
第3部分 vector示例
下面我们通过实例学习如何使用stack
import java.util.stack;
import java.util.iterator;
import java.util.list;
/**
* @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 = null;
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 = null;
for(iterator iter = list.iterator(); iter.hasnext(); ) {
val = (string)iter.next();
system.out.print(val+" ");
}
system.out.println();
}
}
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.util;
public
class stack<e> extends vector<e> {
// 版本id。这个用于版本升级控制,这里不须理会!
private static final long serialversionuid = 1224463164541339165l;
// 构造函数
public stack() {
}
// push函数:将元素存入栈顶
public e push(e item) {
// 将元素存入栈顶。
// addelement()的实现在vector.java中
addelement(item);
return item;
}
// pop函数:返回栈顶元素,并将其从栈中删除
public synchronized e pop() {
e obj;
int len = size();
obj = peek();
// 删除栈顶元素,removeelementat()的实现在vector.java中
removeelementat(len - 1);
return obj;
}
// 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() - i;
}
return -1;
}
}
总结:
(01) stack实际上也是通过数组去实现的。
执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
执行pull时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
(02) stack继承于vector,意味着vector拥有的属性和功能,stack都拥有。
第3部分 vector示例
下面我们通过实例学习如何使用stack
复制代码 代码如下:
import java.util.stack;
import java.util.iterator;
import java.util.list;
/**
* @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 = null;
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 = null;
for(iterator iter = list.iterator(); iter.hasnext(); ) {
val = (string)iter.next();
system.out.print(val+" ");
}
system.out.println();
}
}