数据结构--堆栈

一、堆栈的概念

  一种含有插入(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;
	}

}

 三、栈的具体用途

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

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

posted @ 2017-03-18 22:16  CoderLcp  阅读(534)  评论(0编辑  收藏  举报