有。
数据结构中的栈,在解决很多问题都有用处,比如括号匹配,迷宫求解,表达式求值等等,java中有封装好的类,可以直接调用。
使用链表来实现栈比用数组更加方便,也易于节省空间,因为栈只能在栈顶进行操作,不需要进行随机访问栈元素。首先实现栈接口IStack,提供出栈、入栈、获取栈顶元素、判断是否为空以及清空栈等基本功能:定义一个Node类,用于保存链中点的信息。
栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
//这是JDK提供的栈import java.util.Stack
public class UsingStack {
public static void main(String[] args) {
//构造栈对象,使用类型限制,只能存储Integer数据
Stack<Integer>s = new Stack<Integer>()
//1、2、3依次入栈
s.push(1)
s.push(2)
s.push(3)
//3、2、1依次出栈
System.out.println(s.pop())
System.out.println(s.pop())
System.out.println(s.pop())
}
}
//这是我写的顺序结构的栈
import java.util.EmptyStackException
import java.util.Vector
public class UsingStack{
public static void main(String[] args){
//构造栈对象,使用类型限制,只能存储Integer数据
MyStack<Integer>s = new MyStack<Integer>()
//1、2、3依次入栈
s.push(1)
s.push(2)
s.push(3)
//3、2、1依次出栈
System.out.println(s.pop())
System.out.println(s.pop())
System.out.println(s.pop())
}
}
/**
* 栈类
* @author developer_05
* @param <T>
*/
class MyStack<T>extends Vector<T>{
/**
* 构造方法
*/
public MyStack(){
}
/**
* 入栈方法
* @param item 待入栈的元素
* @return 返回入栈的元素
*/
public T push(T item) {
addElement(item)
return item
}
/**
* 出栈方法(同步处理)
* @return 返回出栈元素
*/
public synchronized T pop() {
T obj
int len = size()
if (len == 0)
throw new EmptyStackException()
obj = elementAt(len - 1)
removeElementAt(len - 1)
return obj
}
/**
* 判断栈是否为空的方法
* @return 返回true(栈空)或false(栈非空)
*/
public boolean empty() {
return size() == 0
}
private static final long serialVersionUID = 1L
}
存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)。\x0d\x0a\x0d\x0a栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定。\x0d\x0a\x0d\x0a局部变量的数据存在于栈内存中。\x0d\x0a\x0d\x0a栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。