栈是数据结构里最常用的一种,有时候给一个有序的输入要判断一种顺序是否符合栈的输出.
例如:输入为:1 2 3 4 5 6 来判断怎样的输出是符合栈的特点的输出
输出为 : 1 2 3 4 5 6 是符合的 因为可以1入1出 2 入2出 ……最后6入6出。
输出为:6 5 4 3 2 1也是可以的 因为可以1 2 3 4 5 6都入栈然后在一一出栈
输出为:5 6 2 3 4 1 是违法的 因为无论怎么进行压栈和出栈是得不到这个结果的 栈的输入是从小到大的 所以当输出6时除了5已经输出外 其他的(1234)都是在栈中的 而且因为他们的入栈是按序的 所以出栈也是按序的(顺序正好相反) 所以总结出一个判断规则 :比当前数小的且在当前数之后进行输出的他们的输出顺序都是逆序的.例如刚才的输出6之后的2341应该为逆序的 为4321。
下面来写个程序来模拟栈的输出
例:
输入:
6
6 5 4 3 2 1
输出:YES
输入:
7
7 6 4 5 3 2 1
输出:NO
第一个输入为输入的个数 ,第二个输入为输入序列
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdlib.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#define MAXSIZE 50</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">stack</span>[MAXSIZE]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> target[MAXSIZE]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> top=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> ok=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d"</span>,&n)==<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,A=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,B=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//A按序输入的数(总是从1增长到n ) 而B则是当前检测输入的下标</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;i<=n;i++) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">scanf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d"</span>,target+i); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(B<=n)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//检测目标数</span> { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A==target[B]){A++;B++;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//检测按序输入的数和目标数是否相等</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(top&&<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">stack</span>[top]==target[B]){top--;B++;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果栈不为空则检测 检测栈顶的数是否和目标的数相等 相等则退栈</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A<=n)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">stack</span>[++top]=A++;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果按序输入的数和当前的目标数不相等则压栈</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {ok=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;} } <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%s\n"</span>,ok?<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"YES"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"NO"</span>); } }</code>