堆栈的数据结构只允许数据从有序列表的一端做输入输出操作。
堆栈数据结构的特点是先进入的数据后处理,后进入的数据先处理,就比如子弹入弹匣一下,先压入弹匣的子弹后面发射出,后压入的子弹先发射。
下面是用数组模拟堆栈:ArrayOfStack.java
package Stack;
/**
* @author zh
* 数组实现堆栈
*/
public class ArrayOfStack {
private Object[] stack = null;
private int size;
private int top;
//默认初始化一个栈堆,大小为100
public ArrayOfStack(){
this.size = 100;
this.top = -1;
this.stack = new Object[size];
}
//初始化一个自定义大小的栈堆
public ArrayOfStack(int size){
this.size = size;
this.top = -1;
this.stack = new Object[size];
}
//判断堆栈是否为空
public boolean isEmpty(){
if(top == -1){
return true;
}else
return false;
}
//判断栈堆是否已满
public boolean isFull(){
if(top == (size-1)){
return true;
}else
return true;
}
//入栈操作
public void push(String data){
if(isFull()){
System.out.println("堆栈已满");
return;
}
//入栈开始,top相当于数组下标
top++;
stack[top] = data;
}
//出栈
public Object pop(){
//定义一个临时对象
Object val = null;
//堆栈为空时报错
if(isEmpty()){
System.out.println("堆栈为空");
return val;
}
//获取堆栈值
val = stack[top];
top--;
return val;
}
//获取栈顶元素
public Object peek(){
Object topVal = null;
if(isEmpty()){
System.out.println("栈堆为空!");
return topVal;
}
//取出栈顶元素
topVal = stack[top];
return topVal;
}
//获取堆栈元素
public int size(){
return top+1;
}
//获取栈堆容量
public int capcity(){
return size;
}
}
使用链表实现堆栈:
节点类Node.java
package Stack;
public class Node {
//链表数据域
Object data;
//链域
Node next;
//构造头结点
public Node(){
this.data = null;
this.next = null;
}
//构造节点
public Node(Object data){
this.data = data;
this.next = null;
}
}
堆栈类:LinkOfStack.java
package Stack;
public class LinkOfStack {
//定义一个头结点
private Node head;
//构造头结点
public LinkOfStack(){
head = new Node();
}
//判断是否为空
public boolean empty(){
if(head.next == null)
return true;
else
return false;
}
//堆栈入栈
public void push(Object data){
Node item = new Node(data);
item.next = head.next;
head.next = item;
}
//出栈
public Object pop(){
Object item = null;
if(empty()){
System.out.println("堆栈为空");
}
item = head.next.data;
head.next = head.next.next;
return item;
}
//堆栈大小
public int size(){
int len = 0;
Node p = head;
while(p.next != null){
len++;
p = p.next;
}
return len;
}
//获取栈顶元素
public Object peek(){
if(empty()){
System.out.println("堆栈为空");
}
return head.next.data;
}
public static void main(String[] args){
LinkOfStack stack = new LinkOfStack();
stack.push("测试链表堆栈节点一");
System.out.println(stack.size());
System.out.println(stack.peek());
while(!stack.empty()){
System.out.print(stack.pop()+"-->");
}
}
}
来源:https://www.cnblogs.com/advanceBlog/p/7900545.html