1、什么是栈
- 栈(Stack) 实现了一个先进后出 的数据结构。
- 是线性表的一种,限制仅在线性表的一端进行插入和删除操作。
- 允许插入和删除的一端称为栈顶(top),不允许插入和删除的一端称为栈底(bottom)。
- 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。
- 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。
入栈图解:
出栈图解:
2、顺序存储栈的基本操作以及算法实现
基本操作:
初始化、判断是否为空、求栈深、读取栈顶元素、出栈 / 入栈、栈置空等。
抽象出栈的基本操作:
public interface implStack {
public void push(Object obj);
public Object pop();
public int size();
public void clear();
public boolean isEmpty();
public Object top();
}
栈的顺序存储数据结构Java实现:
public class Stack implements implStack {
final int maxsize = 100;
int[] elem = new int[maxsize];
int top;
public Stack() {
top = 0;
}
}
栈置空
public void clear() {
top = 0;
}
判断栈是否为空
public boolean isEmpty() {
if(top > 0) {
return false;
} else {
return true;
}
}
进栈
public void push(int data) {
if(top == maxsize) {
System.out.print("stack overflow");
} else {
elem[top++] = data; //进栈
}
}
出栈
pubic int pop(){
if(top == 0) {
return 0;
} else {
top--;
return elem[top];
}
}
求栈深
public int size(){
return top;
}
读取栈顶元素
public int top() {
if(top == 0) {
return 0;
} else {
return elem[top-1];
}
}
3、链式存储栈的基本操作以及算法实现
顺序存储的栈使用简单,但必须事先分配一定大小的存储空间,分配大了可能会造成浪费,分配小了空间不够可能出现栈溢出异常,此时可考虑链表存储栈中的元素,这样既不会造成浪费又不会造成栈溢出。
链式栈的结构如下:
链栈中的数据结点结构
public class StackNode{
int data;
StackNode next;
}
栈的基本操作不变
public class LinkStack implements implStack {
StackNode top;
public LinkStack(){
top.data = 0;
}
}
链栈的进栈操作
public void push(int data) {
StackNode node = new StackNode();
node.data = data;
node.next = top;
top = node;
}
链栈的出栈操作
public int pop() {
int data;
if(top == null) {
return 0;
} else {
data = top.data;
top = top.next;
return data;
}
}
4、代码实现
import java.util.Stack;
/**
* @author :浪漫不死
* @version: 1.0
* @description:栈
* @date : 2020/11/13 17:05
*/
public class StackDemo {
static void showpush(Stack<Integer> st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<>();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
} catch (Exception e) {
System.out.println("empty stack");
}
}
}