栈和队列
栈
定义
先进的后出
用数组自己写栈
package cn.edu.nefu.stack;
import java.util.Arrays;
public class stackByList {
//定义初始数组stack作为我们的栈
private int [] stack;
//定义初始下标-1表示栈是空的,top为0的话说明有一个数据,这样就可以用top代表最上面数据的下标
private int top = -1;
//定义初始数组的大小
public stackByList(){
stack = new int [10];
}
//压栈(往栈里面加东西)
public void push(int val){
//顶部下标等于栈长度减一说明栈已经满了需要扩容
if(top==stack.length-1){
//如果两倍原数组长度超过了整型最大长度就扩容到整型最大长度,否则就扩容到两倍原数组长度
int newLength =stack.length*2-Integer.MAX_VALUE>0?Integer.MAX_VALUE:stack.length*2;
//表示复制数组stack到新的长度为newLength的数组
stack= Arrays.copyOf(stack, newLength);
}
//更新栈顶下标
top++;
//把下标为栈顶下标的数组元素赋值为val
stack[top]=val;
}
//弹栈(获取并删除数据)
public int pop(){
//先获取目前栈顶的数据,然后把栈顶指针移动到上一个,由于下一次加入数据是直接赋值给栈顶指针的下一个
//会直接覆盖掉栈顶指针后面那个数据,相当于这个数据已经被删掉了
return stack[top--];
}
}
用链表自己写栈(以尾插法为例,头插法也可以)
package cn.edu.nefu.stack;
public class StackByLinkedList {
private class NodeDouble{
private NodeDouble prev;
private int data;
private NodeDouble next;
public NodeDouble(){}
public NodeDouble(int data){
this.data=data;
}
public NodeDouble(NodeDouble prev,int data,NodeDouble next){
this.prev=prev;
this.data=data;
this.next=next;
}
}
private NodeDouble head;
private NodeDouble tail;
//压栈
public void push(int data){
//如果头指针为0说明链表为空,就直接插进去然后把node赋值给head和tail就行
if(head==null){
head=new NodeDouble(data);
tail=head;
return;
}
//链表不为空的话就new一个node,他的prev赋tail也就是前指针指向现在的尾节点
NodeDouble node=new NodeDouble(tail,data,null);
//让tail指向node,tail是变量
tail.next=node;
//把tail的下一个节点赋给tail也就是更新尾节点
tail=node;
}
//弹栈
public int pop(){
//先new一个节点把尾节点赋给他
NodeDouble node=tail;
//把node的data值赋给变量data
int data=node.data;
//把尾节点下一个指向当前要弹出的node的前一个
tail.next=node.prev;
//更新尾节点
tail=tail.next;
return data;
}
public static void main(String[] args) {
StackByLinkedList sbll=new StackByLinkedList();
sbll.push(1);
sbll.push(2);
System.out.println(sbll.pop());
System.out.println(sbll.pop());
}
}