大话数据结构(九)——栈
栈
1、栈的定义
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈,栈又称后进先出(Last In First Out)的线性表,简称LIFO结构。
注意:
1)栈是个线性表,栈元素具有线性关系,即前驱后继的关系。
2)它是一种特殊的线性表,只在表尾进行插入和删除,表尾指的是栈顶。
3)栈底是固定的,最先进栈的只能在栈底。
2、栈的操作
栈的插入操作,叫做进栈,也称压栈,入栈。
栈的删除操作,也做出栈,也叫弹栈。
3、栈的顺序存储结构及实现
栈的顺序存储结构一般用数组实现,下标为0的一端为栈底比较好,因为首元素都存在栈底,变化最小。所以让它作为栈底。
当栈存一个元素,top==0,因此通常把空栈的判定条件定为top=-1.
4、栈的顺序结构中进栈操作及出栈操作代码如下
public class Stack<E> { private ArrayList<E> list = new ArrayList<E>(); private int size; /* * 进栈操作 */ public void push(E e){ list.add(e); size++; } /* * 出站操作 */ public E pop(){ E e = list.get(size-1); size--; return e; } public static void main(String args[]){ Stack<Object> stack = new Stack<Object>(); stack.push("lllll"); stack.push("222222"); for(int i=0;i<=stack.size;i++){ System.out.println(stack.pop()); } } }
5、栈的链式存储结构实现
package com.aclie.dataStructe4.stack;
public class LinkStack {
Node1 top;//栈顶
Node1 cur;//栈顶后面一个结点
int count;
public void add(Object obj){
if(top == null){//空栈
top = new Node1(obj);//栈顶为新结点
top.next1 = cur;//修改栈顶的后继
count++;
}else{
Node1 s =new Node1(obj);//要插入的新结点
s.next1 = top;//插入的结点的后继
cur = s.next1;//修改栈顶的后继
top = s;//栈顶结点
count++;
}
}
public void delete(Object obj){
if(top == null){
System.out.println("无删除 的结点,此表为控栈");
}
if(count == 1){
top = null;
System.out.println("现在为空栈");
count--;
}
if(count>=2){
top = cur;
cur = cur.next1;
count--;
}
}
public void print(Node1 node1){
if(node1 == null){
System.out.println("没有可打印的元素");
}else{
Node1 cur1 = node1;
while(cur1 != null){
System.out.println(cur1.data1);
cur1 = cur1.next1;
}
}
}
public static void main(String args[]){
LinkStack seqStack = new LinkStack();
seqStack.add("oooooo");
seqStack.print(seqStack.top);
seqStack.add("wwwww");
seqStack.add("eeeeee");
seqStack.delete(seqStack.top);
seqStack.print(seqStack.top);
}
}
class Node1{
Object data1;
Node1 next1;
public Node1(Object d1){
this.data1 = d1;
}
}
浙公网安备 33010602011771号