栈(Java)
栈(stack)是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
- 栈是一个先入后出的有序列表
- 栈满时再做进栈运算必定产生空间溢出,简称“上溢”。
- 当栈空时再做退栈运算也将产生溢出,简称
“下溢”。 - 上溢是一种出错状态,应该设法避免之。
下溢则可能是正常现象,因为栈在程序中使
用时,其初态或终态都是空栈,所以下溢常
常用来作为程序控制转移的条件。
实现栈的思路
- 用数组模拟栈
- 定义栈顶top,初始化为-1
- 入栈:有数据入栈时,top++;stack[top]=data
- 出栈:int value=stack[top];top–;
代码实现
public class ArrayStack {
public static class Arraystack{
private static int maxSize; // 栈的大小
private static int[] stack; // 数组,数组模拟栈,数据就放在该数组
private static int top = -1;// top表示栈顶,初始化为-1
public Arraystack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
//栈满
public static boolean isFull() {
return top == maxSize - 1;
}
//栈空
public static boolean isEmpty() {
return top == -1;
}
//入栈-push
public void push(int value) {
//先判断栈是否满
if(isFull()) {
System.out.println("栈满");
return;
}
top++;
stack[top] = value;
}
//出栈-pop, 将栈顶的数据返回
public int pop() {
//先判断栈是否空
if(isEmpty()) {
//抛出异常
throw new RuntimeException("栈空,没有数据~");
}
int value = stack[top];
top--;
return value;
}
//显示栈的情况[遍历栈], 遍历时,需要从栈顶开始显示数据
public void list() {
if(isEmpty()) {
System.out.println("栈空,没有数据~~");
return;
}
//需要从栈顶开始显示数据
System.out.println("栈中元素为:");
for(int i = top; i >= 0 ; i--) {
System.out.printf("%d\n",stack[i]);
}
}
}
public static void main(String[] args) {
Arraystack stack=new Arraystack(10);
stack.push(1);//入栈
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.list();
stack.pop();
stack.list();
}
}
运行结果
栈中元素为:
5
4
3
2
1
栈中元素为:
4
3
2
1
链表实现栈
实现思想
- 链表栈中包括结点类和栈顶结点top,初始化top=null
- 入栈:将新结点指向原栈顶结点,新栈顶结点指向新结点
- 出栈:栈顶出栈,将新栈顶结点指向下一个结点
public class liststack {
private static Node top;
public static class Node{
private int data;
private Node next;
public Node(int data){
this.data=data;
this.next=next;
}
}
public liststack() {
top=null;
}
//入栈
public static void push(int data) {
Node node=new Node(data);
if(top==null) {
top=node;
}else {
node.next=top;
top=node;
}
}
//出栈
public static int pop() throws Exception{
if(top==null) {
throw new Exception("empty");
}
Node node=top;
top=top.next;
return node.data;
}
//遍历
public static void show() {
Node node=top;
System.out.println("栈中的数据为:");
while(node!=null) {
System.out.println(node.data);
node=node.next;
}
}
public static void main(String[] args) throws Exception {
//测试数据
push(1);
push(2);
push(3);
push(4);
System.out.println("执行入栈操作");
show();
System.out.println("执行出栈操作");
pop();
show();
}
}
运行结果
执行入栈操作
栈中的数据为:
4
3
2
1
执行出栈操作
栈中的数据为:
3
2
1