1.栈的定义
栈是一种特殊的线性表,栈中的元素以及元素间的逻辑关系与线性表相同,两者的差别在于:线性表的插入和删除可以在线性表的任意位置,而栈的插入和删除只能在链表的尾部进行。其中,栈中允许进行插入和删除的一端称为栈顶,另一端称为栈底。假设栈的数据元素序列为{a0, a1, a2, … , an-1},则a0称为栈底元素,an-1称为栈顶元素。将数据插入操作称为入栈,将数据删除操作称为出栈。
从栈的概念概念可知,栈是一种后进先出(LIFO)的线性表。
2.栈的抽象数据定义
栈也是由n(n≥0)个元素所构成的有限序列,其数据元素的类型可以是任意的,但是只要是同一种类型即可。根据栈的特性,接口描述如下。
public interface IList {
public void clear();
public boolean isEmpty();
public Object top();
public void push(Object data);
public void pop() throws Exception;
public int length();
public void display();
}
栈根据存储结构不同也分为顺序结构栈和链式结构栈。
3.链式栈及其基本操作
public class LinkedStack implements IList {
Node head;
int size;
LinkedStack(){
head = null;
size = 0;
}
public void clear(){
head = null;
size = 0;
}
public boolean isEmpty(){
return head == null;
}
public Object top(){
return head.getData();
}
public void push(Object data){
head = new Node(head, data);
size++;
}
public void pop() throws Exception{
if(isEmpty()){
throw new Exception("栈为空!!!");
}
head= head.getNext();
size--;
}
public int length(){
return size;
}
public void display(){
Node pos = head;
System.out.print("[");
while(pos != null){
System.out.print(pos.getData() + ",");
pos = pos.getNext();
}
System.out.print("\b]\n");
}
}
4. 测试
public class Test {
public static void main(String[] args) throws Exception{
String exp = "2+3*5";
char[] exps = exp.toCharArray();
LinkedStack list = new LinkedStack();
for(int i = 0; i < exps.length; i++){
list.push(exps[i]);
}
list.display();
for(int i = 0; i < exps.length; i++){
list.pop();
System.out.println(list.top() + ",");
}
}
}
结果
[5,*,3,+,2]
[3,+,2]