基于順序表的棧實(shí)現(xiàn):
package StackExercise;
public class MyStack<T> {
// 最大尺寸
public static final int MAXSIZE = 20;
// 頂端
private int top;
// 所有的棧
private Object[] objs;
// 棧的最大值
private int max;
// 初始化
public MyStack() {
this(MyStack.MAXSIZE);
}
public MyStack(int size) {
if (size <= 0) {
throw new RuntimeException("初始化棧必須大于0!" + size);
} else {
objs = new Object[size];
top = -1;
max = size;
}
}
// 壓入元素
public void push(T t) {
if (top == max - 1) {
throw new RuntimeException("棧以滿洲赵!");
} else {
objs[++top] = t;
}
}
// 彈出頂部元素
public T pop() {
if (top == -1) {
throw new RuntimeException("棧為空唉铜!");
} else {
T ret = (T) objs[top];
objs[top--] = null;
return ret;
}
}
// 是否為空
public boolean isEmpty() {
return top == -1;
}
// 是否滿
public boolean isFull() {
return top == max - 1;
}
// 查看頂部元素节值,不彈出
public T peek() {
if (top == -1) {
throw new RuntimeException("棧為空鸡捐!");
} else {
return (T) objs[top];
}
}
public void print() {
for (int i = 0; i <= top; i++) {
System.err.println(objs[i]);
}
}
}
測(cè)試代碼:
package StackExercise;
public class Main {
public static void main(String[] args) {
MyStack<Integer> t = new MyStack<Integer>();
for (int i = 0; i < 10; i++) {
t.push(i);
}
t.print();
for (int i = 0; i < 3; i++) {
t.pop();
}
t.print();
}
}
基于順序表的鏈表實(shí)現(xiàn):
package StackExercise;
public class LinkedStack<T> {
// 最大尺寸
public static final int MAXSIZE = 20;
// 所有的棧
public LinkedStackData<T> head;
// 棧的頂端
public int top;
// 棧的最大值
public int max;
// 初始化
public LinkedStack() {
this(LinkedStack.MAXSIZE);
}
public LinkedStack(int size) {
if (size <= 0) {
throw new RuntimeException("初始化棧必須大于0鞠鲜!" + size);
} else {
head = new LinkedStackData<T>();
top = -1;
max = size;
}
}
// 是否為空
public boolean isEmpty() {
return top == -1;
}
// 是否滿
public boolean isFull() {
return top == max - 1;
}
// 查看頂部元素嗅绸,不彈出
public T peek() {
if (top == -1) {
throw new RuntimeException("棧為空脾猛!");
} else {
return (T) (findTop().data);
}
}
// 彈出頂部元素
public T pop() {
T ret = null;
if (top == -1) {
throw new RuntimeException("棧為空!");
} else {
LinkedStackData<T> tData = head;
while (tData.next != null) {
if (tData.next.next == null) {
ret = tData.next.data;
tData.next = null;
break;
}
tData = tData.next;
}
}
return ret;
}
// 壓入元素
public void push(T t) {
if (top == max - 1) {
throw new RuntimeException("棧以滿朽砰!");
} else {
LinkedStackData<T> newData = new LinkedStackData<T>();
newData.data = t;
LinkedStackData<T> topData = findTop();
topData.next = newData;
top++;
}
}
// 尋找頂部元素
private LinkedStackData<T> findTop() {
LinkedStackData<T> tData = head;
while (tData.next != null) {
tData = tData.next;
}
return tData;
}
// 打印
public void print() {
LinkedStackData<T> i = head;
while (i.next != null) {
i = i.next;
System.err.println(i.data);
}
}
}
基礎(chǔ)數(shù)據(jù)類:
package StackExercise;
public class LinkedStackData<T> {
// 下一個(gè)
public LinkedStackData<T> next;
// 當(dāng)前數(shù)據(jù)
public T data;
}
測(cè)試代碼:
package StackExercise;
public class Main {
public static void main(String[] args) {
LinkedStack<Integer> t = new LinkedStack<Integer>();
for (int i = 0; i < 10; i++) {
t.push(i);
}
t.print();
for (int i = 0; i < 3; i++) {
t.pop();
}
t.print();
}
}
以為這個(gè)會(huì)比鏈表東西會(huì)多一些尖滚,但是寫起來感覺比鏈表好像要簡(jiǎn)單,也可能是方法少,但是理解起來可能對(duì)新手有一些難度吧瞧柔。