栈的实现(java):
栈是大家比较熟悉的一种数据结构了,关于它的一些具体内容就不多说了,我们要记住的就是LIFO(后进先出)特性。因为栈是一种表,所以任何实现表的方法都能实现栈,这里我们选择两种方式来实现栈,即数组和链表。
Java代码实现栈
数组实现
package com.tongtong;
import java.util.Arrays;
/**
* 数组方式实现栈
*/
public class MyStack<E> {
private Object[] stack; //数组
private int size; //数组中存储元素的个数
public MyStack(){
stack = new Object[10]; //初始长度为10
}
//判断堆栈是否为空
public boolean isEmpty(){
return size == 0;
}
//访问栈顶元素
public E peek(){
return (isEmpty()?null : (E)stack[size-1]);
}
//弹出元素
public E pop(){
E e = peek();
stack[size-1] = null;
size--;
return e;
}
//压入元素
public E push(E item){
ensureCapacity(size+1); //检查容量
stack[size++] = item;
return item;
}
//判断数组是否已满,若已满,则扩充数组空间
private void ensureCapacity(int size){
int len = stack.length;
if(size > len){ //数组已满
int newLen = 10; //每次数组扩充的容量
stack = Arrays.copyOf(stack,newLen); //扩充数组
}
}
public static void main(String[] args) {
MyStack<Integer> s = new MyStack<Integer>();
s.push(1);
s.push(2);
s.push(3);
System.out.println(s.size);
System.out.println(s.peek());
System.out.println(s.pop());
System.out.println(s.size);
}
}
链表实现
package com.tongtong;
/**
* 定义单链表
* @param <E>
*/
class Node<E>{
Node<E> next = null;
E data;
public Node(E data){this.data = data;}
}
public class MyStack2<E> {
Node<E> top = null;
public boolean isEmpty(){
return top == null;
}
public void push(E data){
//创建一个Node
Node<E> newNode = new Node<E>(data);
//把新创建的Node放在top前
newNode.next = top;
//top指向新创建的Node
top = newNode;
}
public E pop(){
if(this.isEmpty()){
return null;
}
E data = top.data; //取出top中的数据,用于返回
top = top.next; //将top节点删除
return data; //返回栈顶元素
}
public E peek(){
if(this.isEmpty()){
return null;
}
return top.data;
}
public static void main(String[] args) {
MyStack2<Integer> s = new MyStack2<Integer>();
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
System.out.println(s.peek());
System.out.println(s.pop());
System.out.println(s.peek());
}
}