判断出栈顺序是否正确,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;
}
首先,我们将出栈顺序保存在一个数组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;
}
相关文章推荐
- 判断栈的压入顺序与弹出顺序是否正确C++
- javascript或asp实现的判断身份证号码是否正确两种验证方法
- 判断是否正确的出栈顺序
- C++实现判断字符串是否回文实例解析
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(Python实现)
- C++模板,判断是否存在成员函数,实现差异化操作
- C++ 一句话实现是否为2的若干次幂的判断
- 算法C++ 判断出栈顺序是否正确
- c++实现身份证是否合法判断函数
- 判断某序列是否为另一个序列的出栈序列 C++实现
- 判断出栈顺序是否正确(栈的压入、弹出序列)
- 一个非常简洁有效的判断IP地址格式是否正确的函数,c++代码
- (PHP实现剑指offer)在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- C++判断用户输入路径是否正确(判断盘符是否存在以及“\”与"/")
- 判断点是否在线段上(C++实现)
- 如何在C++中实现对输入数是否为小数的判断
- 给定入栈顺序,判断出栈顺序是否正确。
- C++ 判断栈的弹出序列是否正确
- 二叉搜索树应用-判断一个单词是否拼写正确,实现简单字典
- 判断点是否在线段上(C++实现)