数组实现
package stack;
/**
* 这是一个用Java实现的栈的数据结构。
* @author Stephen Huge
*
*/
public class Stack {
private Object[] objs;
/** 栈的大小 */
private int size;
/** 构造方法*/
public Stack() {
objs = new Object[16];
size = 0;
}
/** 构造方法*/
public Stack(Object element) {
objs = new Object[16];
size = 0;
objs[size] = element;
size++;
}
/**
* 返回栈的长度
*/
public int size() {
return size;
}
/**
* 判断是否是空栈
*/
public boolean isEmpty() {
return size==0;
}
/**
* 清空栈内数据
*/
public void clear() {
for(int i = 0; i < objs.length; i++){
if(objs[i] != null) {
objs[i] = null;
}
}
size = 0;
}
public void push(Object element) {
//判断是否需要扩容
if(size >= objs.length) {
reSize();
}
objs[size++] = element;
}
/**
* 数组扩容
*/
private void reSize() {
Object[] temp = new Object[2 * objs.length];
for(int i = 0; i < objs.length; i++){
temp[i] = objs[i];
}
objs = temp;
}
/**
* 出栈
*/
public Object pop() {
if(isEmpty()) {
return null;
}else {
Object temp = objs[size - 1];
objs[size - 1] = null;
size--;
return temp;
}
}
public String toString() {
if(isEmpty()) {
return "[]";
}else{
StringBuilder sb = new StringBuilder();
sb.append("ArrayStack:[");
for(int i = 0; i < size; i++) {
sb.append(objs[i].toString());
if(i != size - 1){
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
public static void main(String[] args) {
Stack myStack = new Stack("aaa");
System.out.println(myStack.isEmpty());
myStack.push("bbb");
myStack.push("ccc");
myStack.push("ddd");
System.out.println(myStack.size());
myStack.pop();
System.out.println(myStack.size());
System.out.println(myStack.toString());
}
}
运行结果:
false
4
3
ArrayStack:[aaa, bbb, ccc]
链表实现
【注】:每入栈一个元素,实际操作会把这个元素变成链表的头结点,也就是会更新头结点而不是尾节点。
package stack;
import linearlist.LinkList;
/**
* 这是一个用Java实现的链栈的数据结构。这里需要注意的是每入栈一个元素,实际操作会把这个元素
* 变成链表的头结点,也就是会更新头结点而不是尾节点。
* @author Stephen Huge
*
*/
public class LinkStack<T>{
/**
* 私有内部类Node
*/
private class Node{
public T data;
public Node next;
public Node() { }
public Node(T element, Node next) {
this.data = element;
this.next = next;
}
}
/** 栈顶元素 */
private Node top;
/** 栈的长度 */
private int size = 0;
/** 栈的构造函数 */
public LinkStack() { }
/** 有参构造函数 */
public LinkStack(T element) {
top = new Node();
top.data = element;
size++;
}
/** 返回栈的长度 */
public int size() {
return size;
}
/** 判断栈是否是空栈 */
public boolean isEmpty() {
return size == 0;
}
/** 清空栈 */
public void clear() {
if(isEmpty()){
return;
}else {
top = null;
top.data = null;
size = 0;
}
}
/** 压栈 */
public void push(T element) {
top = new Node(element, top);
size++;
}
/** 出栈 */
public T pop() {
if(isEmpty()){
return null;
}else{
Node prevTop = top;
top = top.next;
prevTop.next = null;
size--;
return prevTop.data;
}
}
/** 按出栈顺序toString() */
public String toString() {
if(isEmpty()) {
return "[]";
}else{
StringBuilder sb = new StringBuilder();
Node temp = top;
sb.append("Top[");
for(int i = 0; i < size; i++) {
sb.append(temp.data.toString());
temp = temp.next;
if(i != size-1){
sb.append(", ");
}
}
sb.append("]Buttom");
return sb.toString();
}
}
public static void main(String[] args) {
LinkStack<String> myLinkStack = new LinkStack<String>("aaa");
System.out.println(myLinkStack.isEmpty());
myLinkStack.push("bbb");
myLinkStack.push("ccc");
myLinkStack.push("ddd");
System.out.println(myLinkStack.size());
myLinkStack.pop();
System.out.println(myLinkStack.size());
System.out.println(myLinkStack.toString());
}
}
运行结果:
false
4
3
Top[ccc, bbb, aaa]Buttom