首页 > 代码库 > 判断一个序列是否是栈的弹出序列
判断一个序列是否是栈的弹出序列
给定两个序列,判断后一个序列是否是
第一个序列入栈的出栈顺序
学习过在数据结构的人肯定遇到过很多这种题目
比如给定一个序列 如 1 2 3 4 5的入栈序列
问 4 5 3 2 1是不是前者的一个出栈序列
思路
首先看 出栈序列 4 5 3 2 1 第一个元素是4 也就是说入栈时 必须要先找到4 然后出栈在继续找 5 ,可以用一个栈来存储当前的入栈元素
比如在 4出栈是 此时 栈中应该有 1 2 3 因为 入栈顺序为 1 2 3 4 123 在4的前面,所以还继续在栈中 下面以一个表格来表示
步骤 | 操作 | 栈中元素 | 弹出数字 第一个为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");
}
代码如下所示:
#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");
}
判断一个序列是否是栈的弹出序列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。