栈是一种特殊的线性表,采用后进先出的模式。
数组方法
定义一个固定长度的数组,每次push前判断top是否等于size,当等于时说明数组内部已经填满,应进行扩充,否则直接将数据填入到top位置,top++。
代码如下:
class stack1{
//采用数组方式
Object[] stack;
int top;
int size;
public void init_stack1(){
//初始化栈的大小
size=10;
stack=new Object[size];
top=0;
}
public void push_stack1(Object data){
if(top>=size){
//top=size时说明栈内已填满,栈内位置不够,进行扩充,每次扩充一倍
size=size*2;
stack= Arrays.copyOf(stack,size);
}
stack[top]=data;
top++;
System.out.println(stack[top-1]+"添加成功");
}
public void pop_stack1(){
if(top!=0){
//说明栈内有数据,可以进行弹栈
Object t=stack[top-1];
stack[top-1]=null;
top--;
System.out.println(t+"删除成功");
}
}
public void print_stack1(){
//将栈内元素全部清空
while (top>0){
System.out.print(stack[top-1]+",");
stack[top-1]=null;
top--;
}
}
}
链表方法
链表采用动态扩充的方式,push时将数据添加到top指针指向的结点,创建一个新节点,top指针移动。pop时将top指针的前结点指向null,将top结点释放,top指针移动。
代码如下:
class stack2{
//采用链表的方式
DNode node;
DNode top;
DNode base;
int size;
public void init_stack2(){
node=new DNode();
top=new DNode();
base=new DNode();
node.setData(null);
node.next=null;
top.next=node;
base.next=node;
}
public void push_stack2(Object data){
top.next.setData(data);
System.out.println(top.next.getData()+"添加成功!");
node=new DNode();
node.next=null;
node.pre=top.next;
top.next.next=node;
top.next=node;
System.out.println("此时的栈顶数据为:"+top.next.getData());
}
public void pop_stack2(){
Object t=top.next.pre.getData();
//将栈顶结点的前结点指向null
top.next.pre.next=null;
//将栈顶结点释放
top.next.free();
//栈顶指针向前移
top.next=top.next.pre;
System.out.println(t+"删除成功");
}
public void print_stack2(){
//将栈内数据全部弹出
while (top.next.pre!=base.next) {
System.out.print(top.next.pre.getData() + ",");
top.next = top.next.pre;
}
System.out.print(base.next.getData());
}
}
主函数:
package List;
import java.util.Arrays;
public class stack {
public static void main(String[] args){
stack1 stack1=new stack1();
stack1.init_stack1();
stack1.push_stack1('a');
stack1.push_stack1('b');
stack1.pop_stack1();
stack1.push_stack1('c');
stack1.print_stack1();
System.out.println("------------------------------");
stack2 stack2=new stack2();
stack2.init_stack2();
stack2.push_stack2('a');
stack2.push_stack2('b');
stack2.pop_stack2();
stack2.push_stack2('c');
stack2.print_stack2();
}
}
运行结果: