数据结构复习之【栈】

来源:互联网 发布:手机淘宝怎么注册账号 编辑:程序博客网 时间:2024/04/29 13:16

栈:先进后出的线性表;

栈也可以通过顺序存储和链式存储的方式实现;


一、顺序存储实现

 

数组的尾端作为栈顶;

代码实现:


package org.xiazdong.list;public class MyArrayStack<T> {private static final int DEFAULT_LENGTH = 10;private T[]t;private int length;private int top;public MyArrayStack(){t = (T[])new Object[DEFAULT_LENGTH];length = 0;top = -1;}public void push(T e){if((top+1)>=t.length){larger(t.length*2);}top++;if(top>=t.length){}t[top]=e;}public T top(){return t[top];}public T pop(){if(top<0){throw new ArrayIndexOutOfBoundsException();}T tmp = t[top];top--;return tmp;}public int getSize(){return top+1;}private void larger(int len){T[]tmp = (T[])new Object[len];for(int i=0;i<t.length;i++){tmp[i] = t[i];}t = tmp;}}


二、链式存储实现

 

链表的头端作为栈顶;

代码实现如下:

package org.xiazdong.list;import org.xiazdong.list.MyLinkedList.Node;public class MyLinkedStack <T>{private Node top;private int count;public MyLinkedStack(){count = 0;top = null;}public T pop(){if(top==null){throw new ArrayIndexOutOfBoundsException();}T elem = top.elem;top = top.next;return elem;}public T top(){return top.elem;}public void push(T e){Node n = new Node();n.elem = e;n.next = top;top = n;}class Node{private T elem;Node next;public Node(){elem = null;next = null;}public Node(T elem,Node next){this.elem = elem;this.next = next;}}}


三、比较

 

 顺序存储链式存储优点访问快、增加删除都为O(1)增加删除都为O(1),对于空间没有限制缺点浪费空间,容易溢出指针需要空间

 

四、栈的应用

 

1.递归

 

我们这里以斐波那契数为例;fib(n) = fib(n-1)+fib(n-2),fib(2) = fib(1) = 1;

递归和栈是密不可分的,递归的实现就是通过栈来完成的;


 

2.后缀表达式

 

我们在做计算器应用时肯定会用到后缀表达式,中缀表达式转换到后缀表达式,后缀表达式求出值都是通过栈实现的;

后缀表达式的讲解在:http://blog.csdn.net/xiazdong/article/details/7272693

 

 

 

 

 

原创粉丝点击