栈
对于栈,学习编程的同学一定都不陌生,先进后出,这就是他的基本思想,他在java中有一下应用:
Stack stack = new Stack();
stack.push(Object item)//入栈
/**
源代码
*/
public E push(E item) {
addElement(item);
return item;
}
由于Stack继承了Vector,addElement(item)为Vector中的方法
class Stack<E> extends Vector<E>
stack.pop()//出栈
/**
源代码
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
stack.peek()//获取栈顶元素,注意是获取,不是出栈
/**
源代码
*/
public synchronized E peek() {
int len = size();
//栈顶如果为空会报错,这是非常重要的一点,写代码的时候一定要进行判断
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
stack.empty();//判断是栈是否为空
public boolean empty() {
return size() == 0;
}
注意这里返回的是布尔类型,如果想判断不为在前面加上!,即!stack.empty();
stack.search(Object o)//查找元素在栈中的位置,以1为基数,返回-1代表无此元素
/**
源代码
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
栈在我们的系统的的运用中是非常广泛的,例如Linux系统中的cd命令
cd a/b/c/../../
这个命令最后进入a目录,系统是如何进入a目录中的呢,这就是栈的应用,这都可以当做一道面试题了,很多人都不知道。
还有递归,很多人只会使用它,你们知道它是如何实现的吗?
递归的实现就是:每次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶中弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层参数的原因。
我们在使用递归函数的时候,会遇到一种错误就是栈溢出,系统报出异常
Segmentation fault(并不代表所有的Segmentation fault异常都是栈溢出),如果你使用的是递归,你应该检查一下是不是无限递归了,那样就会使栈溢出。
其实在企业项目开发中一般是不使用递归的,因为项目较大,参数和全局变量等数据会非常多,使用递归很容易判断不成分return条件,很有可能会导致无限递归或者递归过深,造成栈溢出,况且递归会耗大量的时间。
若有误,请指教!