活动发布类网站开发软装设计培训
活动发布类网站开发,软装设计培训,学校网站建设申请,坯子库登录成wordpress栈的定义栈是限制在表的一段进行插入和删除的运算的线性表#xff0c;通常能够将插入、删除的一端为栈顶#xff0c;例外一端称为栈底#xff0c;当表中没有任何元素的时候称为空栈。通常删除(又称“退栈”)叫做弹出pop操作#xff0c;每次删除的都是栈顶最新的元素#x…栈的定义栈是限制在表的一段进行插入和删除的运算的线性表通常能够将插入、删除的一端为栈顶例外一端称为栈底当表中没有任何元素的时候称为空栈。通常删除(又称“退栈”)叫做弹出pop操作每次删除的都是栈顶最新的元素每次插入(又称“进栈”)称为压入push操作。当栈满的时候进行push 操作会上溢当空栈的时候进行退栈操作的时称为下溢。上溢是一种出错的情况下溢可能是正常的情况处理。堆栈的运算是按照后进先出的原则简称LIFO。栈的基本运算定义initStack构造一个空栈stackEmpty判断是否为空stackFUll判断是否栈满push进栈将该元素压入栈顶pop退栈弹出栈顶元素注意非空判断stackTop去除栈顶元素不改变指针。做个简单的Stack接口package com.wuwii.utils;/*** 堆栈* author Zhang Kai* version 1.0* since 2017/12/14 22:51*/public interface Stack {/*** 进栈** param element 进栈的元素*/void push(E element);/*** 弹出栈顶元素 并改变指针** return 栈顶元素*/E pop();/*** 返回栈顶元素 不改变指针** return 栈顶元素*/E topElement();/*** 判断是否为空栈** return true为空栈*/Boolean isEmpty();/*** 清空栈*/void clear();}顺序栈就是符合LIFO运算规则的顺序线性表。package com.wuwii.utils;/*** 顺序栈* author Zhang Kai* version 1.0* since 2017/12/14 23:05*/public class ArrayStack implements Stack {/*** 初始化栈的默认大小*/private final int defaultSize 10;/*** 栈的集合大小*/private int size;/*** 栈顶的位置*/private int top;/*** 元素存储在数组*/private Object[] elements;/*** 初始化默认大小为10 的栈*/public ArrayStack() {initStack(defaultSize);}/*** 初始化指定大小的栈* param givenSize 指定栈大小*/public ArrayStack(Integer givenSize) {initStack(givenSize);}/*** 初始化栈* param givenSize 给定的栈大小*/private void initStack(Integer givenSize) {size givenSize;top 0;elements new Object[size];}/*** 清空栈*/Overridepublic void clear() {top 0;}/*** 进栈* param element 进栈的元素*/Overridepublic void push(E element) {sizeCheckForPush();elements[top] element;}/*** 弹出栈顶元素 并改变指针* return 栈顶元素*/Overridepublic E pop() {sizeCheckForPop();return (E) elements[--top];}/*** 返回栈顶元素 不改变指针* return 栈顶元素*/Overridepublic E topElement() {sizeCheckForPush();return (E) elements[top - 1];}/*** 判断是否为空栈* return true为空栈*/Overridepublic Boolean isEmpty() {return size 0;}/*** 在进栈的时候检查*/private void sizeCheckForPush() {if (top size) {throw new RuntimeException(Stack overflow);}}/*** 退栈检查*/private void sizeCheckForPop() {if (isEmpty()) {throw new RuntimeException(Stack is empty);}}}链式栈符合LIFO运算规则的链式线性表。package com.wuwii.utils;/*** author Zhang Kai* version 1.0* since 2017/12/15 12:58*/public class LinkStack implements Stack {/*** 链式单元*/private Node top;/*** 初始化链式堆栈*/public LinkStack() {initStack();}/*** 初始化*/private void initStack() {top null;}/*** 存储单元*/private static class Node {E element;Node next;Node(E element, Node next) {this.element element;this.next next;}}/*** 进栈** param element 进栈的元素*/Overridepublic void push(E element) {top new Node(element, top);}/*** 弹出栈顶元素 并改变指针** return 栈顶元素*/Overridepublic E pop() {checkEmpty();E element top.element;top top.next;return element;}/*** 返回栈顶元素 不改变指针** return 栈顶元素*/Overridepublic E topElement() {checkEmpty();return top.element;}/*** 判断是否为空栈** return true为空栈*/Overridepublic Boolean isEmpty() {return top null;}/*** 清空栈*/Overridepublic void clear() {if (isEmpty()) {return;}for (Node x top; x ! null; ) {Node next x.next;x.element null;x.next null;x next;}size 0;}/*** 检查链式堆栈是否为空为空抛出异常*/private void checkEmpty() {if (isEmpty()) {throw new RuntimeException(LinkStack is empty);}}}首先push 修改新产生的链表节点的next 域并指向栈顶然后设置top 指向新的链表节点pop则相反。顺序栈和链式栈的比较实现链式栈和顺序栈的操作都是需要常数时间时间复杂度为O(1)主要从空间和时间复杂度考虑。顺序栈初始化的时候必须要给定指定大小当堆栈不满的时候会造成一部分的空间浪费链式栈变长相对节约空间但是增加了指针域额外加大了数据结构的开销。当需要多个堆栈共享的时候顺序存储中可以充分的利用顺序栈的单向延伸将一个数组可以存在两个堆栈里每个堆栈从各自的栈顶出发延伸这样减少了空间的浪费。但只有两个为堆栈的空间有相反的需求的时候才能使用。就是最好一个堆栈只能增加一个只能减少。如果两个一起增加可能造成堆栈的溢出。如果在多个顺序堆栈共享空间一个堆栈满了其他可能没满需要使用堆栈的LIFO 运算法则将满的堆栈元素向左或者右进行平移操作这样会造成大量的数据元素移动使得时间的开销增大。相对来说使用两个堆栈共享一个空间是比较适宜的存储方式但是也增加了堆栈溢出的危险。由于链式存储结构的不连续性什么时候需要就什么时候去存储不存在溢出的问题但是增加了结构的开销总体上来说浪费了空间但是不需要堆栈共享
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89195.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!