<h2>1、<strong>drop-out<span style="font-family: 黑体;">栈能够用来做什么?</span></strong></h2> <p align="justify"><span style="font-family: 宋体;">  在许多提供编辑功能的软件,如</span>word<span style="font-family: 宋体;">、</span><span style="font-family: Calibri;">ps</span><span style="font-family: 宋体;">、画图,都会提供“撤销”和“恢复”功能,使用drop-out能够实现这些功能。</span></p> <p align="justify">&nbsp;</p> <h2>2、<strong>drop-out<span style="font-family: 黑体;">栈特性</span></strong></h2> <p align="justify">  drop-out<span style="font-family: 宋体;">栈是一种特殊的栈,具有如下特征:</span></p> <p align="justify">  1、<span style="font-family: 宋体;">栈的大小固定</span></p> <p align="justify">  2、<span style="font-family: 宋体;">如果在栈满的情况下希望往栈中压入一个数据,栈底的数据会被清除以腾出空间容纳要新的数据。</span></p> <p align="justify">&nbsp;</p> <h2>3、<strong>drop-out<span style="font-family: 黑体;">栈实现</span></strong></h2> <p align="justify"><span style="font-family: 宋体;">  在此提供一种</span>drop-out<span style="font-family: 宋体;">栈的实现方法:循环队列</span></p> <p align="justify"><span style="font-family: 宋体;"><img src="https://uploadfiles.nowcoder.com/images/20200504/352511047_1588521761150_7BCD8865475F5D831184973C19E04B90"></span></p> <p align="justify"><img src="https://uploadfiles.nowcoder.com/images/20200504/352511047_1588521761256_90AE86D0581892763489F62D23A8A1CB"></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p align="justify">&nbsp;</p> <p align="justify">&nbsp;</p> <p align="justify"><span style="font-family: 宋体;">&nbsp;</span></p> <pre><span style="color: #cc7832;">package learnspring.learnspring.normalJava<span style="color: #cc7832;">;<br><span style="color: #cc7832;"><br><span style="color: #cc7832;"><br><span style="color: #cc7832;">import java.awt.datatransfer.StringSelection<span style="color: #cc7832;">;<br><span style="color: #cc7832;"><br><span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@author <span style="color: #629755; font-style: italic;">肖政宇<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@date <span style="color: #629755; font-style: italic;">2019-09-28 21:21<br><span style="color: #629755; font-style: italic;"> * 说明:drop-out栈具有这样的特性:栈满以后,如果试图向栈中压入数据,<br><span style="color: #629755; font-style: italic;"> * 栈底的数据会自动被弹出。<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #cc7832;">public class DropOutStack <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * size - 栈大小<br><span style="color: #629755; font-style: italic;"> * stack - 栈<br><span style="color: #629755; font-style: italic;"> * top - 栈顶(当前能够插入数据的位置)<br><span style="color: #629755; font-style: italic;"> * bottom - 栈底<br><span style="color: #629755; font-style: italic;"> * total - 栈内数据总数<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">private final int <span style="color: #9876aa;">size<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> private Object<span style="color: #9876aa; font-style: italic;">[] <span style="color: #9876aa;">stack<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> private int <span style="color: #9876aa;">top<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> private int <span style="color: #9876aa;">bottom<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> private int <span style="color: #9876aa;">total<span style="color: #cc7832;">;<br><span style="color: #cc7832;"><br><span style="color: #cc7832;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * constructor<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@param <span style="color: #8a653b; font-style: italic;">stackSize <span style="color: #629755; font-style: italic;">- the size of the stack<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@throws <span style="color: #629755; font-style: italic;">Exception - wrong size<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public <span style="color: #ffc66d;">DropOutStack<span style="color: #9876aa; font-style: italic;">(<span style="color: #cc7832;">int stackSize<span style="color: #9876aa; font-style: italic;">) <span style="color: #cc7832;">throws Exception <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(stackSize &lt;= <span style="color: #6897bb;">1<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">throw new Exception<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">"wrong value!" + stackSize<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">this.<span style="color: #9876aa;">size = stackSize<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> this.<span style="color: #9876aa;">stack = <span style="color: #cc7832;">new Object<span style="color: #9876aa; font-style: italic;">[stackSize<span style="color: #9876aa; font-style: italic;">]<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> this.<span style="color: #9876aa;">top = <span style="color: #6897bb;">0<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> this.<span style="color: #9876aa;">bottom = <span style="color: #6897bb;">0<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> this.<span style="color: #9876aa;">total = <span style="color: #6897bb;">0<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * get the size of the stack<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@return <span style="color: #629755; font-style: italic;">- the size of the stack<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public int <span style="color: #ffc66d;">size<span style="color: #9876aa; font-style: italic;">() {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">return <span style="color: #9876aa;">size<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * push a data into the stack<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@param <span style="color: #8a653b; font-style: italic;">object <span style="color: #629755; font-style: italic;">= data that you want to push onto the stack<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@return <span style="color: #629755; font-style: italic;">- true or false<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public Boolean <span style="color: #ffc66d;">push<span style="color: #9876aa; font-style: italic;">(Object object<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">try <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[<span style="color: #9876aa;">top<span style="color: #9876aa; font-style: italic;">] = object<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa;">top = <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">top + <span style="color: #6897bb;">1<span style="color: #9876aa; font-style: italic;">) % <span style="color: #9876aa;">size<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #808080;">//stack is full<br><span style="color: #808080;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">total == <span style="color: #9876aa;">size<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #808080;">//the bottom element have been drop<br><span style="color: #808080;"> <span style="color: #9876aa;">bottom = <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">bottom + <span style="color: #6897bb;">1<span style="color: #9876aa; font-style: italic;">) % <span style="color: #9876aa;">size<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">} <span style="color: #cc7832;">else <span style="color: #9876aa; font-style: italic;">{<span style="color: #808080;">//stack is not full yet<br><span style="color: #808080;"> <span style="color: #9876aa;">total++<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">return true;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">} <span style="color: #cc7832;">catch <span style="color: #9876aa; font-style: italic;">(Exception e<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> e.printStackTrace<span style="color: #9876aa; font-style: italic;">()<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> return false;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> }<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * get the data from the top of the stack<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@return <span style="color: #629755; font-style: italic;">- a data from the top of the stack<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@throws <span style="color: #629755; font-style: italic;">Exception - the stack is empty<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public Object <span style="color: #ffc66d;">peek<span style="color: #9876aa; font-style: italic;">() <span style="color: #cc7832;">throws Exception <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">total == <span style="color: #6897bb;">0<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">throw new Exception<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">"the stack is empty!"<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #808080;">//get the data from the top of the stack<br><span style="color: #808080;"> <span style="color: #9876aa;">top = <span style="color: #9876aa;">top == <span style="color: #6897bb;">0 ? <span style="color: #9876aa;">size - <span style="color: #6897bb;">1 : <span style="color: #9876aa;">top - <span style="color: #6897bb;">1<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> return <span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[<span style="color: #9876aa;">top<span style="color: #9876aa; font-style: italic;">]<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * drop a data from the top of the stack<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@return <span style="color: #629755; font-style: italic;">- a data from the top of the stack<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@throws <span style="color: #629755; font-style: italic;">Exception - the stack is empty<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public Object <span style="color: #ffc66d;">pop<span style="color: #9876aa; font-style: italic;">() <span style="color: #cc7832;">throws Exception <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">total == <span style="color: #6897bb;">0<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">throw new Exception<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">"the stack is empty!"<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #808080;">//get the data from the top of the stack<br><span style="color: #808080;"> <span style="color: #9876aa;">top = <span style="color: #9876aa;">top == <span style="color: #6897bb;">0 ? <span style="color: #9876aa;">size - <span style="color: #6897bb;">1 : <span style="color: #9876aa;">top - <span style="color: #6897bb;">1<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> Object object = <span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[<span style="color: #9876aa;">top<span style="color: #9876aa; font-style: italic;">]<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #808080;">//delete the data from the top of the stack<br><span style="color: #808080;"> <span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[<span style="color: #9876aa;">top<span style="color: #9876aa; font-style: italic;">] = <span style="color: #cc7832;">null;<br><span style="color: #cc7832;"> <span style="color: #808080;">//change the number of elements in the stack<br><span style="color: #808080;"> <span style="color: #9876aa;">total--<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> return object<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #629755; font-style: italic;">/**<br><span style="color: #629755; font-style: italic;"> * Is the stack empty?<br><span style="color: #629755; font-style: italic;"> *<br><span style="color: #629755; font-style: italic;"> * <span style="color: #629755; font-weight: bold; font-style: italic;">@return <span style="color: #629755; font-style: italic;">- true or false<br><span style="color: #629755; font-style: italic;"> */<br><span style="color: #629755; font-style: italic;"> <span style="color: #cc7832;">public Boolean <span style="color: #ffc66d;">isEmpty<span style="color: #9876aa; font-style: italic;">() {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">return <span style="color: #9876aa;">total == <span style="color: #6897bb;">0<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"><br><span style="color: #9876aa; font-style: italic;"> <span style="color: #bbb529;">@Override<br><span style="color: #bbb529;"> <span style="color: #cc7832;">public String <span style="color: #ffc66d;">toString<span style="color: #9876aa; font-style: italic;">() {<br><span style="color: #9876aa; font-style: italic;"> StringBuilder stringStack = <span style="color: #cc7832;">new StringBuilder<span style="color: #9876aa; font-style: italic;">()<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> stringStack.append<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">'['<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> for <span style="color: #9876aa; font-style: italic;">(<span style="color: #cc7832;">int i = <span style="color: #6897bb;">0<span style="color: #cc7832;">; i &lt; <span style="color: #9876aa;">size<span style="color: #cc7832;">; i++<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[i<span style="color: #9876aa; font-style: italic;">] != <span style="color: #cc7832;">null<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> stringStack.append<span style="color: #9876aa; font-style: italic;">(<span style="color: #9876aa;">stack<span style="color: #9876aa; font-style: italic;">[i<span style="color: #9876aa; font-style: italic;">])<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">} <span style="color: #cc7832;">else <span style="color: #9876aa; font-style: italic;">{<br><span style="color: #9876aa; font-style: italic;"> stringStack.append<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">"null"<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> <span style="color: #cc7832;">if <span style="color: #9876aa; font-style: italic;">(i + <span style="color: #6897bb;">1 &lt; <span style="color: #9876aa;">size<span style="color: #9876aa; font-style: italic;">) {<br><span style="color: #9876aa; font-style: italic;"> stringStack.append<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">','<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;"> }<br><span style="color: #9876aa; font-style: italic;"> stringStack.append<span style="color: #9876aa; font-style: italic;">(<span style="color: #6a8759;">']'<span style="color: #9876aa; font-style: italic;">)<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> return stringStack.toString<span style="color: #9876aa; font-style: italic;">()<span style="color: #cc7832;">;<br><span style="color: #cc7832;"> <span style="color: #9876aa; font-style: italic;">}<br><span style="color: #9876aa; font-style: italic;">}<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <p align="justify"><span style="font-family: 宋体;"> <br></span></p>