zoukankan      html  css  js  c++  java
  • 数据结构复习之【栈】

    栈:先进后出的线性表;

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


    一、顺序存储实现

    数组的尾端作为栈顶;

    代码实现:


    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

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    .NET Core MVC 发布到IIS配置文件
    TP5导出scv格式数据,支持百万数据
    PHP导出Excel表格及设置表格样式
    如何查看Linux的内存使用状况
    tp5.1 + think-queue + supervisor
    java使用HAMC签名加密调用第三方接口
    记录:SpringBoot多个配置文件激活一个
    通过反射获取注解
    (function(){})(jQuery)与$.fn的使用
    IDEA配置203底座之lib配置
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058062.html
Copyright © 2011-2022 走看看