判断入栈顺序是否合法
判断入栈顺序是否合法,这个问题其实很简单,前提得先明白原理。现在就以一道题为例
解题思路:
假设有5个数,出站顺序是1 2 5 3 4,看下面的示意图
首先,栈为空,先将入栈序列的1入栈,这时,站顶元素和出栈的第一个元素相同,于是1出栈;
栈此时又为空,然后在讲入栈序列的2入栈,同样,站顶元素和出栈的第二个元素相同,于是2出栈;
同样的,3再入栈,站顶元素和出栈的第三个元素相同,于是3出栈;
继续,4入栈,发现栈顶元素和第四个出栈序列元素不同,
就让5入栈,发现栈顶元素与第四个出栈序列元素相同,于是5出栈;
此时发现入栈序列已经为空(1,2,3,4,5)都已入栈,没有可入栈的元素了,于是将栈顶与第五个出栈序列的元素相比
发现栈顶与第五个出栈序列的元素相等,于是,4出栈。
此时栈为空,按照上面的步骤,证明1 2 3 5 4是合法的出栈顺序。
再看下面一个例子
依旧是5个数,出栈顺序是1 2 5 3 4,看示意图
按照上面的方法
首先,栈为空,先将入栈序列的1入栈,这时,站顶元素和出栈的第一个元素相同,于是1出栈;
栈此时又为空,然后在讲入栈序列的2入栈,同样,站顶元素和出栈的第二个元素相同,于是2出栈;
同样的,3再入栈,站顶元素和出栈的第三个元素不相同,于是4入栈;
发现栈顶元素和第三个出栈序列元素也不同,
就让5入栈,发现栈顶元素与第三个出栈序列元素相同,于是5出栈;
此时发现入栈序列已经为空(1,2,3,4,5)都已入栈,没有可入栈的元素了,于是将栈顶与第四个出栈序列的元素相比
发现栈顶与第四个出栈序列的元素相等,因为没有可入栈的元素了,所以1 2 5 3 4不是合法的出栈顺序。
大家模拟几遍就会了,至于下面代码,可以作为参考
#include<iostream> using namespace std; struct Stack{ int data; int *base,*top; }; void InitStack(Stack &s){ s.base=new int[105]; s.top=s.base; } void Push(Stack &s,int value){ *(s.top++)=value; } void Pop(Stack &s){ *(--s.top); } bool Empty(Stack s){ if(s.base==s.top){ return true; } return false; } int GetTop(Stack s){ return *(s.top-1); } int main(){ int n,value; Stack s; while(cin>>n){ InitStack(s); int A[n]; for(int i=0;i<n;i++){ cin>>A[i]; } for(int i=0,j=0;i<n;i++){ Push(s,i+1); while(!Empty(s) && GetTop(s)==A[j]){ Pop(s); j++; } } if(Empty(s)){ cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } }
大家可以尝试拓展一下,如果给出的不是数字,而是一连串的字符,又怎么弄呢,其实方法是一样的,只不过代码实现会有所不同!