栈也是一种线性表,它通常有两种实现方式——顺序栈和链式栈
首先定义一个接口,定义在栈中的常用工作
package Stack;
public interface MyStack<T> {
/*入栈*/
boolean push(T data);
/*出栈*/
T pop();
/*判断站是否为空*/
boolean isEmpty();
/*栈的大小(长度)*/
int length();
/*销毁栈*/
void clear();
}
顺序栈
package Stack;
/*底层用数组实现栈*/
public class StackTest<T> implements MyStack<T>{
private int top;
private int PRE_SIZE;
private float fParam;
private Object[] objs;
public StackTest(int PRE_SIZE,float fParam)
{
this.PRE_SIZE = PRE_SIZE;
this.fParam = fParam;
top = 0;
objs = new Object[PRE_SIZE];
}
@Override
public boolean push(Object data) {
if(top >= PRE_SIZE)
{
resize();
}
objs[top++] = data;
return true;
}
@Override
public T pop() {
if(top == 0)
{
return null;
}
return (T) objs[--top];
}
@Override
public boolean isEmpty() {
return top == 0;
}
@Override
public int length() {
return top;
}
@Override
public void clear() {
for(int i = 0;i < top;i++)
{
objs[i] = null;
}
top = 0;
}
private void resize()
{
Object[] temp = new Object[(int)(objs.length*fParam)];
for(int i = 0;i < top;i++)
{
temp[i] = objs[i];
objs[i] = null;
}
objs = temp;
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("MyArrayStack: [");
for (int i = 0; i < top; i++) {
sb.append(objs[i].toString());
if (i != top - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
public static void main(String[] args)
{
StackTest st = new StackTest(20,2.0f);
st.push(1);
st.push("jing");
st.push(3);
System.out.println(st);
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
}
}
链式栈
package Stack;
public class StackTestL implements MyStack<Object> {
private class LinkNode
{
Object element;
LinkNode next;
LinkNode(Object element,LinkNode next)
{
this.element = element;
this.next = next;
}
LinkNode(LinkNode next)
{
this.next = next;
}
}
private LinkNode top;
int size;
public StackTestL()
{
top = new LinkNode(null);
size = 0;
}
@Override
public boolean push(Object data) {
top = new LinkNode(data,top);
size++;
return true;
}
@Override
public Object pop() {
if(size == 0)
return null;
LinkNode stemp = top;
top = null;
top = stemp.next;
size--;
return stemp.element;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public int length() {
return size;
}
@Override
public void clear() {
for(int i = 0;i < size;i++)
{
top = null;
top = top.next;
}
size = 0;
}
public String toString()
{
LinkNode stemp = top;
String st = "";
for(int i = 0;i < size;i++)
{
st += stemp.element;
st += " ";
stemp = stemp.next;
}
return st;
}
public static void main(String[] args)
{
StackTestL stl = new StackTestL();
for(int i = 0;i < 5;i++)
{
stl.push(i);
}
System.out.println(stl);
System.out.println(stl.length());
}
}
用栈实现汉诺塔模型
package List;
import Stack.StackTestL;
public class Recursion1 {
public enum TOHop
{
DOMOVE,DOTOH;
}
class TOHobj
{
TOHop op;
int num;
String start,goal,tmp;
TOHobj(int n,String s,String g,String t)
{
this.op = TOHop.DOTOH;
this.num = n;
this.start = s;
this.goal = g;
this.tmp = t;
}
TOHobj(String s,String g)
{
this.op = TOHop.DOMOVE;
this.start = s;
this.goal = g;
}
}
void TOH(int n,String start,String goal,String tmp,StackTestL stl)
{
stl.push(new TOHobj(n,start,goal,tmp));
TOHobj t;
while(!stl.isEmpty())
{
t = (TOHobj) stl.pop();
int num = t.num;
tmp = t.tmp;
goal = t.goal;
start = t.start;
if(t.op == TOHop.DOMOVE)
{
System.out.println(start + "->" + goal);
}
else if(t.num > 0)
{
stl.push(new TOHobj(num-1,tmp,goal,start));
stl.push(new TOHobj(start,goal));
stl.push(new TOHobj(num-1,start,tmp,goal));
}
t = null;
}
}
public static void main(String[] args) {
Recursion1 res = new Recursion1();
StackTestL stl = new StackTestL();
res.TOH(3, "A", "C", "B", stl);
}
}
这名字起得太乱了