一、栈是什么?
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
二、栈的基本操作
1、初始化
2、判空
3、取栈顶元素
4、元素个数,即长度
5、入栈
6、出栈
7、显示栈的全部元素
8、销毁
栈的表示和实现
1、表示方法
1、顺序栈
栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
2、链式栈
链式栈是通过单链表来实现的。每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现
2、实现
1、链式栈的实现
创建节点
public class Node {
int data;
Node next;
public Node(int data){
this.data=data;
}
}
栈的基本操作
public class Stack {
//栈顶
private Node top;
//栈的长度
private int size;
//
public Stack(){
top=null;
}
//栈的初始化
public void initalStack(int data){
top.data=data;
size++;
}
//判断栈是否为空
public Boolean isEmpty(){
return size==0;
}
//将栈清空,即销毁
public void clear(){
top=null;
size=0;
}
//栈的长度
public int stackSize(){
System.out.print("栈的长度:");
return size;
}
//入栈
public void push(Node node){
//将目标节点的next指向当前top
node.next=top;
//将目标节点赋值给当前top
top=node;
//此时的top是目标节点,原先的top是目标节点的下一个节点
size++;
}
//出栈
public int pop(){
if(isEmpty()){
return -1;
}
top=top.next;
size--;
System.out.print("出栈数据:");
return oldTop.data;
}
//查询栈顶元素
public int peek(){
System.out.print("栈顶元素:");
return top.data;
}
//从栈顶到栈底打印栈的全部元素
public void showStack(){
if(isEmpty()){
System.out.println("空栈");
return;
}
System.out.println("当前栈自上而下:");
//新手可能会忘记这句话
//cur的作用就是临时变量作为top的引用,使得循环打印栈的全部元素正常运行
Node cur=top;
while(true){
System.out.print(cur.data+" ");
if(cur.next==null){
break;
}
cur=cur.next;
}
System.out.println();
}
}
运行结果
public static void main(String[] args) {
Stack stack=new Stack();
System.out.println(stack.isEmpty());
stack.push(new Node(0));
System.out.println(stack.getSize());
stack.push(new Node(1));
stack.push(new Node(5));
stack.showStack();
System.out.println(stack.peek());
System.out.println(stack.getSize());
System.out.println(stack.pop());
stack.showStack();
}