栈
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; } }