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
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    BZOJ 4408: [Fjoi 2016]神秘数
    51Nod 1317 相似字符串对
    51Nod 1561 另一种括号序列
    BZOJ 4556: [Tjoi2016&Heoi2016]字符串
    51Nod 1048 整数分解为2的幂 V2
    BZOJ 4698: Sdoi2008 Sandy的卡片
    BZOJ 3571: [Hnoi2014]画框
    BZOJ 2752: [HAOI2012]高速公路(road)
    BZOJ 1095: [ZJOI2007]Hide 捉迷藏
    BZOJ 4537: [Hnoi2016]最小公倍数
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058062.html
Copyright © 2011-2022 走看看