数据结构之栈(java语言版)
栈(stack): 在逻辑上是一种线性存储结构,它有以下几个特点:
1、栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
2、向栈中添加/删除数据时,只能从栈顶进行操作。
栈通常包括的三种操作:push、peek、pop。
push -- 向栈中添加元素。
peek -- 返回栈顶元素。
pop -- 返回并删除栈顶元素的操作。
栈底层可以基于数组(顺序表),也可以基于链表。
基于数组实现的栈,需要满足数组的特点,查询快,不能动态增长。
基于链表实现的栈,可以动态增长,开销大。
数组栈
数组采用前篇的顺序表,链接在这里数据结构与算法学习目录
基于该顺序表实现的栈。
public class Stack {
Array list;
public Stack() {
this.list=new Array(20);//数组容量
}
public void push(Object e) {//入栈
list.add(e);
}
public Object pop() {//出栈
return list.removeHead();
}
public Object peek(){//返回栈顶元素
return list.get(0);
}
public void display() {//遍历
list.display();
}
public int getSize() {//长度
return list.getSize();
}
}
基于栈的特点,很多操作都被限制了,所以实现很简单。
测试
public static void main(String[] args) {
Stack stack=new Stack();
stack.push("ok");
stack.push("hello");
stack.push("world");
stack.push(0);
stack.display();
Object e=stack.peek();
System.out.println("此时栈顶元素为:"+e);
stack.pop();
System.out.println("此时栈顶元素被弹出");
stack.display();
}
结果如下:
add success
add success
add success
add success
display:
ok hello world 0
display over...
此时栈顶元素为:ok
此时栈顶元素被弹出
display:
hello world 0
display over...
链表栈
采用之前的单向链表构造栈。
public class LinkStack {
SingleLinkList list;
public LinkStack() {
this.list=new SingleLinkList();
}
public void push(Object e) {//入栈
System.out.println("入栈");
list.add(e);
}
public Object pop() {//出栈
Object e=peek();
list.remove(1);
System.out.println("出栈");
return e;
}
public Object peek(){//返回栈顶元素
return list.get(1);
}
public void display() {//遍历
list.display();
}
public int getSize() {//长度
return list.getSize();
}
}
测试
LinkStack stack2=new LinkStack();
stack2.push(1);
stack2.push(2);
stack2.push(3);
stack2.push(4);
stack2.display();
Object e2=stack2.peek();
System.out.println("此时栈顶元素为:"+e2);
stack2.pop();
System.out.println("此时栈顶元素被弹出");
stack2.display();
结果如下:
入栈
入栈
入栈
入栈
开始遍历数据:
1 2 3 4
遍历结束
此时栈顶元素为:1
出栈
此时栈顶元素被弹出
开始遍历数据:
2 3 4
遍历结束