近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。
实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线性栈和链式栈,代码比较简单,如下:
1 package com.peter.java.dsa.interfaces; 2 3 /** 4 * 栈操作定义 5 * 6 * @author Peter Pan 7 */ 8 9 public interface Stack<T> { 10 /* 判空 */ 11 boolean isEmpty(); 12 13 /* 清空栈 */ 14 void clear(); 15 16 /* 弹栈 */ 17 T pop(); 18 19 /* 入栈 */ 20 boolean push(T data); 21 22 /* 栈的长度 */ 23 int length(); 24 25 /* 查看栈顶的元素,但不移除它 */ 26 T peek(); 27 28 /* 返回对象在栈中的位置 */ 29 int search(T data); 30 }
线性栈:以数组的方式实现。
1 package com.peter.java.dsa.common; 2 3 import com.peter.java.dsa.interfaces.Stack; 4 5 /** 6 * 线性栈 7 * 8 * @author Peter Pan 9 */ 10 public class LinearStack<T> implements Stack<T> { 11 @SuppressWarnings("unchecked") 12 private T[] t = (T[]) new Object[16]; 13 private int size = 0; 14 15 @Override 16 public boolean isEmpty() { 17 // TODO Auto-generated method stub 18 return size == 0; 19 } 20 21 @Override 22 public void clear() { 23 // TODO Auto-generated method stub 24 for (int i = 0; i < t.length; i++) { 25 t[i] = null; 26 } 27 size = 0; 28 } 29 30 @Override 31 public T pop() { 32 // TODO Auto-generated method stub 33 if (size == 0) { 34 return null; 35 } 36 T tmp = t[size - 1]; 37 t[size - 1] = null; 38 size--; 39 return tmp; 40 } 41 42 @Override 43 public boolean push(T data) { 44 // TODO Auto-generated method stub 45 if (size >= t.length) { 46 resize(); 47 } 48 t[size++] = data; 49 return true; 50 } 51 52 @Override 53 public int length() { 54 // TODO Auto-generated method stub 55 return size; 56 } 57 58 @Override 59 public T peek() { 60 // TODO Auto-generated method stub 61 if (size == 0) { 62 return null; 63 } else { 64 return t[size - 1]; 65 } 66 } 67 68 /* return index of data, return -1 if no data */ 69 @Override 70 public int search(T data) { 71 // TODO Auto-generated method stub 72 int index = -1; 73 for (int i = 0; i < t.length; i++) { 74 if (t[i].equals(data)) { 75 index = i; 76 break; 77 } 78 } 79 return index; 80 } 81 82 @SuppressWarnings("unchecked") 83 private void resize() { 84 T[] tmp = (T[]) new Object[t.length * 2]; 85 for (int i = 0; i < t.length; i++) { 86 tmp[i] = t[i]; 87 t[i] = null; 88 } 89 t = tmp; 90 tmp = null; 91 } 92 93 /* from the left to the right is from the top to the bottom of the stack */ 94 @Override 95 public String toString() { 96 // TODO Auto-generated method stub 97 StringBuffer buffer = new StringBuffer(); 98 buffer.append("Linear Stack Content:["); 99 for (int i = t.length - 1; i > -1; i--) { 100 buffer.append(t[i].toString() + ","); 101 } 102 buffer.append("]"); 103 buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, ""); 104 return buffer.toString(); 105 } 106 107 }
链式栈:通过单链表进行实现。
1 package com.peter.java.dsa.common; 2 3 import com.peter.java.dsa.interfaces.Stack; 4 5 public class LinkedStack<T> implements Stack<T> { 6 private Node top; 7 private int size; 8 9 @Override 10 public boolean isEmpty() { 11 // TODO Auto-generated method stub 12 return size == 0; 13 } 14 15 @Override 16 public void clear() { 17 // TODO Auto-generated method stub 18 top = null; 19 size = 0; 20 } 21 22 @Override 23 public T pop() { 24 // TODO Auto-generated method stub 25 T topValue = null; 26 if (top != null) { 27 topValue = top.data; 28 Node oldTop = top; 29 top = top.prev; 30 oldTop.prev = null; 31 size--; 32 } 33 return topValue; 34 } 35 36 @Override 37 public boolean push(T data) { 38 // TODO Auto-generated method stub 39 Node oldTop = top; 40 top = new Node(data); 41 top.prev = oldTop; 42 size++; 43 return true; 44 } 45 46 @Override 47 public int length() { 48 // TODO Auto-generated method stub 49 return size; 50 } 51 52 @Override 53 public T peek() { 54 // TODO Auto-generated method stub 55 T topValue = null; 56 if (top != null) { 57 topValue = top.data; 58 } 59 return topValue; 60 } 61 62 @Override 63 public int search(T data) { 64 // TODO Auto-generated method stub 65 int index = -1; 66 Node tmp = top; 67 for (int i = size - 1; i > -1; i--) { 68 if (tmp.data.equals(data)) { 69 index = i; 70 break; 71 } else { 72 tmp = tmp.prev; 73 } 74 } 75 tmp = null; 76 return index; 77 } 78 79 @Override 80 public String toString() { 81 // TODO Auto-generated method stub 82 StringBuffer buffer = new StringBuffer(); 83 buffer.append("Linked Stack Content:["); 84 Node tmp = top; 85 for (int i = 0; i < size - 1; i++) { 86 buffer.append(tmp.toString() + ","); 87 tmp = tmp.prev; 88 } 89 tmp = null; 90 buffer.append("]"); 91 buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, ""); 92 return super.toString(); 93 } 94 95 private class Node { 96 T data; 97 Node prev; 98 99 public Node(T data) { 100 // TODO Auto-generated constructor stub 101 this.data = data; 102 } 103 } 104 105 }
学习还在进行中,以后会继续更新代码。