给定两个序列,判断后一个序列是否是
第一个序列入栈的出栈顺序
学习过在数据结构的人肯定遇到过很多这种题目
比如给定一个序列 如 1 2 3 4 5的入栈序列
问 4 5 3 2 1是不是前者的一个出栈序列
首先看 出栈序列 4 5 3 2 1 第一个元素是4 也就是说入栈时 必须要先找到4 然后出栈在继续找 5 ,可以用一个栈来存储当前的入栈元素
步骤 |
操作 |
栈中元素 |
弹出数字 第一个为4,先找到4 |
1 |
1 入栈 |
1 |
|
2 |
2入栈 |
1 2 |
|
3 |
3入栈 |
1 2 3 |
|
4 |
4入栈 |
1 2 3 4 |
此时栈顶元素等于出栈顺序的第一个,找到了,下一步就是要出栈该元素 |
5 |
4 出栈 |
1 2 3 |
4 出栈顺序往后移动,指向5 |
6 |
5入栈 |
1 2 3 5 |
此时栈顶元素等于出栈顺序的第一个,找到了,下一步就是要出栈该元素 |
7 |
5出栈 |
1 2 3 |
4 5 出栈往后移动 指向3 |
8 |
3出栈 |
1 2 |
4 5 3因为栈顶元素等于 出栈元素 |
9 |
2出栈 |
1 |
4 5 3 2因为栈顶元素等于 出栈元素 |
10 |
1出栈 |
|
4 5 3 2 1出完了 如果占为空 且出栈序列中没有了其他就表示为true |
代码如下所示:
#include<iostream>
#include<stack>
using namespace std;
bool JudgeStackA_B(int *pushnumber,int *popnumber,int length)
{
bool result=false;
if(pushnumber!=NULL&&popnumber!=NULL&&length>0)
{
int *p=pushnumber;
int *q=popnumber;
stack<int> s;
while(q-popnumber<length)
{
while(s.empty()||*q!=s.top())
{
if(p-pushnumber==length) // 表示 全 部元素入栈
break;
s.push(*p);
p++;
}
if(s.top()!=*q) // 表示 全 部元素入栈是否找到了相等的出栈元素 没有就结束
break;
s.pop();
q++;
}
if(s.empty()&&q-popnumber==length)
result=true;
}
return result;
}
void main()
{
int a[5]={1,2,3,4,5};
int b[5]={4,5,2,3,1};
if(JudgeStackA_B(a,b,5))
printf("Yes\n");
else
printf("No\n");
}
原文:http://blog.csdn.net/yujin753/article/details/43026377