您的位置:首页 > 编程语言 > C语言/C++

判断出栈顺序是否正确,c++实现

2012-12-31 10:35 537 查看
现有N个元素1,2...N顺序入栈,给出一个出栈序列a1, a2...an判断此出栈序列是否正确,游戏规则是:元素必须后进先出

首先,我们将出栈顺序保存在一个数组target
中,用一个变量current来模拟入栈(当然,要建立一个栈空间stack<int>s),num来表示出栈顺序的当前编号,current和num都初始化为1

那么,下面应该这样来处理

1. 如果当前出栈元素target[num]与模拟的当前入栈元素current相等,num++, current++

2.否则,如果当前模拟的入栈空间不为空且栈顶元素与出栈数组的第一个元素相等,那么就让模拟的入栈空间出栈,出栈的当前顺序num++

3.否则,如果当前模拟的入栈元素还没超过n的话,那么把当前元素压入模拟的入栈空间s,并且为下一次的入栈做准备(即current++)

4.否则,出栈顺序肯定不满足条件,中断

下面看一个例子,假如N = 5,出栈顺序是2, 1, 3, 5, 4显然,这是一个合理的出栈顺序

首先初始化current = 1,num = 1;int target[5] = {2, 1, 3, 5, 4} //为了方便,这里假设下标从1开始

当前入栈元素current为1,出栈顺序的当前元素为2,不相等,按照上面的逻辑应该将current压入栈s中,那么栈s中的当前元素为 1,current++后变成2

当前入栈元素current为2恰好与出栈顺序的当前元素2相等,那么将出栈顺序后移num++,current++后变成3,栈s中的当前元素仍然为1啊

当前入栈元素current为3与出栈顺序的当前元素1不相等,但是栈s中的栈顶元素与出栈顺序当前元素相等,所以将s出栈,将出栈顺序后移变成3

当前入栈元素current为3与出栈顺序的当前元素相等,接下来处理5,4的原理与2,1相同,不再赘述

终上所述,判断出栈顺序是否合理的最终依据还是栈的"先进后出,后进先出"的性质,新建一个栈空间,根据题目中给出的出栈顺序来,来依次模拟出栈入栈

#include <iostream>
#include <stack>
using namespace std;
const int MAXN = 1000 + 10;

int n, target[MAXN];
int main() {
while (cin >> n) {
stack<int> s;
for (int i = 1; i <= n; i++)
cin >> target[i];
int ok = 1;
int current = 1, num = 1;
while (num <= n) {
if (current == target[num]){current++; num++;} //当前元素等于出栈顺序的当前元素
else if (!s.empty() && s.top() == target[num]) {s.pop(); num++;}//这里起始就是模拟出栈
else if (current <= n) s.push(current++); // 这里其实就是模拟入栈
else {ok = 0; break;}
}
cout << (ok ? "yes" : "no") << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐