zoukankan      html  css  js  c++  java
  • 数据结构--堆栈

    一、堆栈的概念

      一种含有插入(push)和弹出(pop)操作的ADT,而且在该数据结构中,弹出符合先进后出的规则,插入则是直接将数据置于该ADT的顶层。看个简单的丑图吧

    恩,具体的结构解释上图说得挺清楚的了,图是有点丑,各位凑合看下。

    二、堆栈的实现方式

      1、pop方法实现方式(基于链表)

      一般来说,堆栈的实现方式是通过链表来实现的,每次pop将链表的最后一个指针返回,修改顶端的元素并调用链表的delete操作即可;具体代码如下:

        //弹出
    	public LinkSingleIntNode pop() throws RuntimeException{
    		if(size==0){
    			throw new RuntimeException( "无元素");
    		}
    		LinkSingleIntNode rtn = point;
    		link.deleteNode(point);
    		point = link.linkTail;//栈顶改变为上一个元素
    		size--;
    		return rtn;
    	}
    

      2、push方法的实现方式(基于链表)

      同样,push的实现方式其实就是链表的add操作,然后将栈顶改为新增的元素即可;具体代码如下:

        //入栈
    	public boolean push(LinkSingleIntNode node){
    		boolean rtn = false;
    		link.addNode(node);
    		point = node;
    		size++;
    		rtn = true;
    		return rtn;
    	}
    

      完整的栈代码也比较简单,只要实现了链表,栈的实现就很简单啦:

    public class HeapInt {
    
    	/*
    	 *
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			HeapInt heap = new HeapInt();
    			heap.push(new LinkSingleIntNode(1));
    			int num = heap.pop().data;
    			System.out.println(num);
    			//int num1 = heap.pop().data;
    			//System.out.println(num1);
    			heap.push(new LinkSingleIntNode(111));
    			heap.push(new LinkSingleIntNode(122));
    			//
    			ArrayList<Integer> list = heap.link.findAll();
    			System.out.println(heap.pop().data);
    			ArrayList<Integer> list1 = heap.link.findAll();
    			System.out.println(heap.pop().data);
    			heap.push(new LinkSingleIntNode(105));
    			heap.push(new LinkSingleIntNode(107));
    			System.out.println(heap.pop().data);
    		} catch (Exception e) {
    			// TODO: handle exception
    			System.out.println("已到栈底");
    		}
    		
    	}
    	public LinkSingleIntNode point = null;//栈顶
    	private LinkSingleInt link = null;//栈的实现链表
    	public int size = 0;//栈元素个数
    	public HeapInt(){
    		point = new LinkSingleIntNode();
    		link = new LinkSingleInt();
    	}
    	//入栈
    	public boolean push(LinkSingleIntNode node){
    		boolean rtn = false;
    		link.addNode(node);
    		point = node;
    		size++;
    		rtn = true;
    		return rtn;
    	}
    	//弹出
    	public LinkSingleIntNode pop() throws RuntimeException{
    		if(size==0){
    			throw new RuntimeException( "无元素");
    		}
    		LinkSingleIntNode rtn = point;
    		link.deleteNode(point);
    		point = link.linkTail;//栈顶改变为上一个元素
    		size--;
    		return rtn;
    	}
    
    }
    

     三、栈的具体用途

      可能你会说,栈好像看起来并没有什么卵用啊,干嘛要这种数据结构啊?其实,栈在计算机里面的用处大着呢,因为它本身就是体现一种计算机执行程序的基本步骤:从某个点断开(中断)相应更高级别的请求-->将断点状态压入栈-->响应请求-->重复上一个步骤-->...;计算机的运行很多时候就是那个循环,栈保证了程序执行两个必要信息:一个是状态信息本身,一个是状态信息恢复的顺序(先入栈的后恢复).

      当然,栈还有很多其他妙用,具体请查看我的下一篇博客-->栈与四则运算

  • 相关阅读:
    数据库表中批量替换某个字段的方法
    css清除浮动方法大全
    IE6中的常见BUG与相应的解决办法
    [转]Oracle 12c多租户特性详解:PDB 的创建、克隆与维护
    Oracle 数据库导入导出 dmp文件
    Tomcat 服务应用
    Perforce 与Source Insight, Visual Studio集成
    Oracle 11g必须开启的服务及服务详细介绍
    Python学习笔记8-单元测试(1)
    Python学习笔记7-高级迭代器
  • 原文地址:https://www.cnblogs.com/lcplcpjava/p/6576438.html
Copyright © 2011-2022 走看看