栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。
栈的开口端被称为栈顶;封口端被称为栈底。
顺序表设定两个变量:1、栈顶指针top 2、栈底指针base(不动)
顺序表中设定一个实时指向栈顶元素的变量(一般命名为 top),top 初始值为 -1,表示栈中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,如果数据元素出栈,top 就做 -1 操作。
数组实现
package TestZhan;
public class ZhanArray {
private int[] array;
private int base; //
private int top; //栈顶指针
private int Size; //栈的容量
//初始化栈
public ZhanArray(int Size){
this.Size = Size;
array = new int[Size]; //分配栈的大小
this.top = -1; //指向栈顶元素的上一个位置
}
//栈是否为空
public boolean isEmpty() { //看top指针是否为-1
return (top == -1) ? true:false;
}
//栈是否满了
public boolean isFull() {
return (top == (this.Size - 1)) ? true:false;
}
//出栈
public int pop() {
int temp;
if(isEmpty()) {
return 0;
}
temp = array[top]; //栈顶变量赋值给临时变量Temp
array[top] = 0; //置空栈顶的位置
top--; //栈顶指针下移
return 1;
}
//压栈
public int push(int elem) {
if(isFull()) {
return 0;
}
top++; //栈顶指针上移一位
array[top] = elem; //元素赋值给栈顶指针指向的位置
return 0;
}
public void showData() {
for(int temp:array) {
System.out.println(temp);
}
}
public static void main(String[] args) {
ZhanArray zhan = new ZhanArray(10);
zhan.push(10);
zhan.push(20);
zhan.push(30);
zhan.push(40);
int k = zhan.push(50);
zhan.showData();
zhan.pop();
zhan.showData();
}
}
链表实现:
链栈实际上就是一个只能采用头插法插入或删除数据的链表
package TestZhan;
class Node<T>{ //链表的节点
private T elem;
private Node<T> next;
public Node() {
this.elem = null;
this.next = null;
}
public Node(T data) {
super();
this.elem = data;
this.next = null;
}
public T getElem() {
return elem;
}
public void setElem(T elem) {
this.elem = elem;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
public class ZhanLink<T>{
private Node<T> top; //栈顶节点
//初始化
public ZhanLink() {
this.top = new Node<T>();
}
//初始化栈
public void initStack() {
this.top.setElem(null);
this.top.setNext(null);
}
//是否为空栈
public boolean isEmpty() {
return (top.getNext() == null) ? true:false;
}
//栈是否满
//
// public boolean isFull() {
// return (top.getElem() == null) ? true:false;
// }
//出栈
public Node<T> pop(){
if(isEmpty())
return null;
Node<T> temp = top.getNext(); //取出当前要删除的栈顶节点
top.setNext(top.getNext().getNext()); //删除节点
return temp;
}
//入栈
public void push(Node<T> node){
if(isEmpty()) {
top.setNext(node);
node.setNext(null);
}
node.setNext(top.getNext());
top.setNext(node);
}
public static void main(String[] args) {
}
}