目录
首先:栈是一个特殊的线性表,只允许在一端进行插入(压栈)和删除元素(进栈),这一端称为栈顶。
栈的实现可以用数组实现,称为顺序栈。时间复杂度为O(1)
也可以用链表实现称为链式栈。尾插入栈:O(n),出栈:O(n)
头插入栈:O(1),从头出栈O(1)
顺序栈:
数组实现栈代码如下(运用了泛型,top下标:代表的是当前可以存放数据元素的下标。
入栈:放入元素到top下标,top++
出栈:top--
出栈和入栈的时间复杂度都是O(1)
package stack.com;
public class MyStack<T> {
public T elem[];
int top; //top是当前能放元素位置的下标
public MyStack() {
this.elem = (T[]) new Object[10];
this.top = 0;
}
//判断是否未满
private boolean isEmpty() {
return top == elem.length;
}
//入栈
public void push(T val) {
if (isEmpty()) {
return;
}
elem[top] = val;
top++;
}
//判断是否为空
private boolean isFull() {
return top == 0;
}
//出栈
public T pop() {
if (isEmpty()) {
return null;
}
T tmp = elem[top-1];
top--;
return tmp;
}
//查看栈顶元素
public T peek() {
return elem[top-1];
}
}
链式栈:
时间复杂度:尾插入栈:O(n) 出栈:O(n);头插入栈:O(1)出栈从头出:O(1)
因此用链式栈采用头插法,从头出栈。
package stack.com;
public class MyListStack {
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
Node head;
//入栈
public void push(int val) {
Node node = new Node(val);
node.next = this.head;
this.head = node;
}
//判断是否为空
private boolean isEmpty() {
return head == null;
}
//出栈
public int pop() {
if (isEmpty()) {
return -1;
}
int tmp = head.data;
head = head.next;
return tmp;
}
//查看栈顶元素
public int peek() {
if (isEmpty()) {
return -1;
}
return head.data;
}
}
Java中的栈:
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1); //压栈
stack.pop(); //出栈
stack.peek(); // 查看栈顶元素
System.out.println(stack.empty()); //判断栈是否为空
}