判断入栈顺序是否合法

判断入栈顺序是否合法,这个问题其实很简单,前提得先明白原理。现在就以一道题为例

解题思路:

假设有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;
        }
    }
}

 大家可以尝试拓展一下,如果给出的不是数字,而是一连串的字符,又怎么弄呢,其实方法是一样的,只不过代码实现会有所不同!

 

posted @ 2016-11-29 15:07  寻觅beyond  阅读(681)  评论(0)    收藏  举报
返回顶部